Bạn thực sự đúng. DbContext
là một triển khai của đơn vị mẫu công việc và IDbSet
là một triển khai của mẫu kho lưu trữ.
Các kho lưu trữ hiện đang rất phổ biến và sử dụng quá mức. Mọi người sử dụng chúng chỉ vì có hàng tá bài viết về việc tạo kho lưu trữ cho khung thực thể nhưng không ai thực sự mô tả các thách thức liên quan đến quyết định này.
Lý do chính để sử dụng kho lưu trữ thường là:
- Ẩn EF từ lớp trên
- Làm cho mã kiểm tra tốt hơn
Lý do đầu tiên là một số loại tinh khiết kiến trúc và ý tưởng tuyệt vời rằng nếu bạn làm cho các lớp trên của bạn độc lập với EF, sau này bạn có thể chuyển sang khung kiên trì khác. Đã bao nhiêu lần bạn nhìn thấy những điều như vậy trong thế giới thực? Lý do này làm cho việc làm việc với EF trở nên khó khăn hơn nhiều vì kho lưu trữ của bạn phải phơi bày rất nhiều tính năng bổ sung bao bọc những gì mà EF cho phép theo mặc định.
Đồng thời gói mã EF có thể giữ cho mã của bạn được tổ chức tốt hơn và tuân theo quy tắc Tách rời mối quan tâm. Đối với tôi đây có thể là lợi thế thực sự duy nhất của kho lưu trữ và đơn vị công việc nhưng bạn phải hiểu rằng tuân theo quy tắc này với EF sẽ có thể giúp mã của bạn duy trì tốt hơn và dễ đọc hơn nhưng trong nỗ lực ban đầu để tạo ứng dụng của bạn sẽ cao hơn nhiều và Đối với các ứng dụng nhỏ hơn, điều này có thể phức tạp không cần thiết.
Lý do thứ hai là một phần chính xác. Nhược điểm lớn của EF là kiến trúc cứng nhắc, khó có thể bị chế giễu, vì vậy nếu bạn muốn kiểm tra đơn vị lớp trên, bạn phải bọc bằng cách nào đó để cho phép thực hiện chế độ của nó. Nhưng điều này có nhiều hậu quả khác mà tôi đã mô tả ở đây .
Tôi theo dõi blog của Ayende . Nếu bạn đã từng sử dụng NHibernate có lẽ bạn biết bài viết của mình. Anh chàng này gần đây đã viết một số bài báo chống lại việc sử dụng kho lưu trữ với NHibernate nhưng NHibernate thì dễ bị nhạo báng hơn nhiều.