Mẫu lưu trữ Từng bước Giải thích [đã đóng]


276

Ai đó có thể vui lòng giải thích cho tôi Mẫu Kho lưu trữ trong .NET, từng bước đưa ra một ví dụ hoặc bản demo rất đơn giản.

Tôi biết đây là một câu hỏi rất phổ biến nhưng cho đến nay tôi vẫn chưa tìm được câu trả lời thỏa đáng.



1
Có một tốt write-up ở đây: deviq.com/repository-pattern
ssmith

Câu trả lời:


199

Tóm lại, tôi sẽ mô tả tác động rộng hơn của mẫu kho lưu trữ. Nó cho phép tất cả các mã của bạn sử dụng các đối tượng mà không cần phải biết các đối tượng được duy trì như thế nào. Tất cả các kiến ​​thức về sự bền bỉ, bao gồm ánh xạ từ các bảng đến các đối tượng, được chứa an toàn trong kho lưu trữ.

Rất thường xuyên, bạn sẽ tìm thấy các truy vấn SQL nằm rải rác trong cơ sở mã và khi bạn đến để thêm một cột vào bảng, bạn phải tìm kiếm các tệp mã để thử và tìm các tập quán của bảng. Tác động của sự thay đổi là sâu rộng.

Với mẫu kho lưu trữ, bạn chỉ cần thay đổi một đối tượng và một kho lưu trữ. Tác động rất nhỏ.

Có lẽ nó sẽ giúp suy nghĩ về lý do tại sao bạn sẽ sử dụng mẫu kho lưu trữ. Dưới đây là một số lý do:

  • Bạn có một nơi duy nhất để thay đổi quyền truy cập dữ liệu của mình

  • Bạn có một nơi duy nhất chịu trách nhiệm cho một tập hợp các bảng (thường)

  • Thật dễ dàng để thay thế một kho lưu trữ bằng một triển khai giả để thử nghiệm - vì vậy bạn không cần phải có sẵn một cơ sở dữ liệu để kiểm tra đơn vị của mình

Cũng có những lợi ích khác, ví dụ, nếu bạn đang sử dụng MySQL và muốn chuyển sang SQL Server - nhưng tôi chưa bao giờ thực sự thấy điều này trong thực tế!


28
RE chuyển từ dbms a sang b, tôi sẽ ghi lại rằng không chỉ tôi đã thấy điều này, tôi đã thực hiện điều này trong mã sản xuất. Trước đây chúng tôi đã sử dụng Oracle, đã phải chuyển đổi nhà cung cấp dịch vụ lưu trữ, đã giải quyết trên Azure (trước khi họ hỗ trợ Oracle), vì vậy chúng tôi phải chuyển đổi sang SQL Azure. Thật không may, chúng tôi đã không tách tất cả logic truy cập dữ liệu vào thời điểm đó, nhưng chúng tôi chắc chắn đã làm điều đó khi chúng tôi thực hiện việc di chuyển đó (và trong tương lai, tôi có thể thêm).
Joe

5
Tôi biết nhận xét này đã cũ và đóng cửa ngoài chủ đề, nhưng tôi đã thấy điều này được thực hiện ở nhiều công ty. Thông thường, đó là một phần của quá trình di chuyển tới hoặc ra khỏi ORM. Kho lưu trữ giúp dễ dàng chuyển đổi nó hơn, đặc biệt nếu bạn tải chúng từ một mẫu nhà máy trừu tượng hoặc sử dụng bộ chứa IoC.
Derek Van Cuyk

Trên thực tế Kho lưu trữ sử dụng DAO cho các hoạt động liên quan đến nguồn dữ liệu của nó ...
Yousha Aleayoub

1
@YoushaAleayoub rằng một điểm tốt bạn nêu ra. Thông thường bạn sẽ tìm thấy Đối tượng truy cập dữ liệu khi mọi người đang cố gắng "phân tách cơ sở dữ liệu" và kho lưu trữ khi mọi người đang cố gắng "tạo một điều duy nhất chịu trách nhiệm cho truy vấn". Trong hầu hết các trường hợp, bạn sẽ tìm thấy cả hai cùng nhau. Phần DAO là IConnection, ICommand, vv phần mà da các loại cơ sở dữ liệu. Các kho lưu trữ thường là miền trung tâm hơn.
Fenton

181

Đây là một ví dụ hay: Ví dụ về mẫu lưu trữ trong C #

Về cơ bản, kho lưu trữ ẩn các chi tiết về cách chính xác dữ liệu đang được tìm nạp / lưu giữ từ / đến cơ sở dữ liệu. Dưới vỏ bọc:

  • để đọc, nó tạo ra truy vấn thỏa mãn các tiêu chí được cung cấp và trả về tập kết quả
  • để viết, nó đưa ra các lệnh cần thiết để làm cho công cụ kiên trì cơ bản (ví dụ: cơ sở dữ liệu SQL) lưu dữ liệu

13
Ví dụ này là lời giải thích tốt nhất từ ​​trước đến nay, đơn giản là tốt hơn tài liệu MSDN.
Teoman shipahi

2
Tôi thấy điều này rất tốt. Nó cũng cung cấp giải thích hợp lý về Đơn vị công việc, dường như là dạng chung hơn của Mẫu dữ liệu so với Mẫu lưu trữ
Celdor

8
Ví dụ liên kết là một lỗi mẫu kho lưu trữ. Nó hoàn toàn không có lợi thế so với việc sử dụng các giao diện được cung cấp bởi Entity Framework ( IDbContext) hoặc ISessiontrực tiếp trong nhibernate ( ). Một kho lưu trữ được triển khai chính xác trừu tượng hóa TẤT CẢ thông tin cụ thể về tính bền vững (như cách nhà cung cấp Linq To Sql hiện tại hoạt động). tức là không bao giờ phơi bày IQueryable.
jgauffin

3
@jgauffin IQueryablekhông kiên trì thông tin cụ thể. Sự hỗ trợ của IQueryable có thể đơn giản như một mảng được mã hóa cứng hoặc có thể là từ tệp XML, dịch vụ web, cơ sở dữ liệu, tệp phẳng, v.v. Tôi sẽ không đề xuất một kho lưu trữ không phơi bày IQueryable như mọi khi dẫn đến việc truy cập dữ liệu chậm trong mọi trường hợp, trong đó việc phơi bày IQueryable sẽ cho phép một số trường hợp thực hiện các cải tiến hiệu suất khi áp dụng nếu cửa hàng lưu trữ lâu bền có khả năng đó. Ngoài ra, ẩn DbContext cho phép bạn chuyển sang một ORM khác nếu cần (hoặc không có ORM!)
Robert McKee

5
Nó rò rỉ thông tin kiên trì thông tin cụ thể. Cố gắng sử dụng háo hức / lười tải hoặc xây dựng một INmệnh đề sql mà không biết nhà cung cấp LinqToSql cụ thể thực hiện việc đó như thế nào.
jgauffin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.