Các kho lưu trữ có cần thiết nữa không trong ASP.net 5 & EF7?


9

Tôi đã đăng một câu hỏi trên github cho Nhóm EF. Tôi nhận được câu trả lời rằng sẽ tốt hơn nếu hỏi câu hỏi này ở đây vì vậy tôi sẽ sao chép và dán nó ở đây vì chúng tôi là một liên kết để người khác có thể thấy một vài câu trả lời trên GitHub.

Câu hỏi: Tôi đang thực hiện một số nghiên cứu và ai đó đã chỉ ra rằng Dòng 24 của Lớp DBContext

DbContext là sự kết hợp của các mẫu Đơn vị công việc và Kho lưu trữ.

Điều này có nghĩa là chúng ta không còn cần phải trừu tượng hóa EF đến Kho lưu trữ và sau đó sử dụng và Giao diện để đưa nó vào Bộ điều khiển?

Bài đăng gốc trên Github: https://github.com/aspnet/EntityFramework/issues/4899

Lý do tôi hỏi điều này là tôi dường như đi vào một nơi mà tôi đang thêm rất nhiều phương thức vào kho lưu trữ như GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, v.v. và dường như nó đang làm bẩn repo


1
Bạn nghĩ gì về câu trả lời của Rowanmiller? Có vẻ hoàn toàn hợp lý với tôi.
Robert Harvey

@RobertHarvey Vâng, đó là một câu trả lời hay nhưng tôi muốn xem người khác cảm thấy thế nào về chủ đề này trước khi tôi đưa ra quyết định lưu trữ hay không
Loren.Dorez 30/03/2016

xem thêm Lostechies.com/jimmybogard/2009/09/11/wither-the-reposeective nơi Bogard lập luận tương tự.
mcknz 30/03/2016

Tôi đưa ra lý do tại sao EF (và các ORM khác) không phải là kho lưu trữ .
Eric King

Một kho lưu trữ sẽ không có phương thức như GetWithIncludesABC. Mẫu kho lưu trữ là một sự trừu tượng hóa, về cơ bản, một bảng cơ sở dữ liệu như là một bộ sưu tập. Thông thường, có thể truy vấn bộ sưu tập (ví dụ: LINQ) và sau đó kho lưu trữ chuyển đổi truy vấn thành SQL. Những gì bạn đang nói về âm thanh giống như một Cổng dữ liệu.
Ông Cochese

Câu trả lời:


12

Nếu bạn đang thêm phương thức vào kho lưu trữ như

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Sau đó, tốt hơn hết là bạn nên chuyển sang Lớp dịch vụ và để Lớp dịch vụ sử dụng trực tiếp EF. EF đã có chức năng tương tự như các phương pháp trên mà bạn chỉ cần nhân đôi vô tận.

Lớp dịch vụ hiển thị các phương thức Miền doanh nghiệp và sử dụng CRUD để triển khai chúng. Ví dụ: bạn có thể có một phương thức được gọi TransferMoney(A, B), trong đó A và B đang kiểm tra tài khoản. Điều này cho phép bạn nói ngôn ngữ của miền doanh nghiệp của bạn, trong khi Lớp dịch vụ xử lý CRUD cho bạn.

Lý do thuyết phục duy nhất tôi có thể nghĩ về nơi bạn có thể muốn có Lớp lưu trữ riêng biệt là để bạn có thể giả định lớp kho lưu trữ đó hoặc thay thế một nguồn dữ liệu khác cho mục đích thử nghiệm.


Tuy nhiên, bạn có thể giả lập dbset ... msdn.microsoft.com/en-us/l
Library / dn314429 (v = vs.113) .aspx

4

Robert Harvey nói trong câu trả lời của mình:

Lý do thuyết phục duy nhất tôi có thể nghĩ về nơi bạn có thể muốn có Lớp lưu trữ riêng biệt là để bạn có thể giả định lớp kho lưu trữ đó hoặc thay thế một nguồn dữ liệu khác cho mục đích thử nghiệm.

Đây chính xác là lý do tại sao Mẫu lưu trữ vẫn có liên quan. Tôi cũng không đồng ý với xác nhận của các nhóm Khung thực thể rằng họ triển khai Mẫu Kho lưu trữ. Entity Framework vẫn còn rất nhiều ràng buộc với cơ sở dữ liệu. Toàn bộ mục đích của Mẫu lưu trữ là tách rời và trừu tượng hóa cơ chế lưu giữ chính xác được sử dụng trong ứng dụng của bạn, để không có gì từ việc thực hiện rò rỉ truy cập dữ liệu bên ngoài lớp kho lưu trữ.

Nếu bạn đang sử dụng API truy vấn EF bên ngoài "kho lưu trữ", như trong một đối tượng dịch vụ thuộc loại nào đó, tôi sẽ nói rằng bạn đang phá vỡ mô hình.

Bây giờ, nếu đó không phải là vấn đề nghiêm trọng đối với cơ sở dữ liệu như chức năng rò rỉ vào mã khác của bạn và bạn có thể đảm bảo rằng bạn sẽ không cần phải chuyển một số hoạt động CRUD của mình sang dịch vụ web trong tương lai, thì sử dụng trực tiếp EF sẽ là ĐỒNG Ý.

Về cơ bản, Entity Framework thay thế đối tượng Gateway trong Mẫu lưu trữ. Tôi không xem nó như một kho lưu trữ.


Kho lưu trữ khác với khía cạnh Lớp dịch vụ như thế nào? từ những gì tôi có thể tìm thấy nếu tôi trả lại IQueryable thì về cơ bản tôi là một Kho lưu trữ nếu tôi trả lại IEnumerable sau đó tôi đang sử dụng một lớp dịch vụ. Điều này có đúng không? Các lớp dịch vụ và mô hình lưu trữ có giống nhau không?
Loren.Dorez 30/03/2016

@ Loren.Dorez: Một lớp dịch vụ có các phương thức dành riêng cho miền doanh nghiệp, như TransferFunds()BuildWidget(). Một kho lưu trữ chỉ chứa các phương thức CRUD.
Robert Harvey

Vậy cả Lớp dịch vụ và Kho lưu trữ sẽ truy cập trực tiếp vào DBContext? Vì vậy, bạn sẽ đặt CRUD trong Phương thức Repo và Nhận và các phương thức khác trong Lớp dịch vụ? Tôi có hiểu điều này một cách chính xác không?
Loren.Dorez 30/03/2016

Tầng dịch vụ có thể truy cập Kho lưu trữ, nếu bạn có, thay vì trực tiếp EF.
Robert Harvey

@RobertHarvey Bạn có thể chỉ cho tôi một ví dụ bằng cách sử dụng Get Methds ở trên không? Như bây giờ tôi hơi bối rối xin lỗi.
Loren.Dorez 30/03/2016

1

Các kho lưu trữ dường như không cần thiết - Microsoft trong các ứng dụng microservice phụ trợ mẫu của họ không sử dụng chúng:

https://github.com/Microsoft/BikeShared360_BackendService

Ứng dụng BikeShared mẫu đã được hiển thị trên Connect (); sự kiện (Tôi nghĩ rằng nó có thể được sử dụng làm mẫu cho các dự án API):

https://bloss.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikeshared360-on-github/

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.