1) Bạn sẽ làm gì nếu bạn muốn tắt ORM, bạn sẽ có mã ORM cụ thể trong ứng dụng của mình nếu bạn không chứa nó trong kho lưu trữ.
Tôi chưa ở vị trí mà công ty đột nhiên quyết định chuyển đổi công nghệ truy cập dữ liệu. Nếu điều này xảy ra, một số công việc sẽ được yêu cầu. Tôi có xu hướng hoạt động truy cập dữ liệu trừu tượng thông qua các giao diện. Kho lưu trữ là một cách để giải quyết điều này.
Sau đó tôi sẽ có một hội đồng khác để thực hiện cụ thể lớp truy cập dữ liệu của mình. Ví dụ: tôi có thể có:
Company.Product.Data
và Company.Product.Data.EntityFramework
lắp ráp. Việc lắp ráp đầu tiên sẽ được sử dụng hoàn toàn cho các giao diện, khi khác sẽ là triển khai cụ thể logic truy cập dữ liệu của Entity Framework.
2) Mẫu kho lưu trữ có còn hợp lệ khi không sử dụng ORM và bạn đang sử dụng ADO.net để truy cập dữ liệu và tự điền dữ liệu đối tượng?
Tôi nghĩ rằng tùy thuộc vào bạn để quyết định mẫu nào hợp lệ hay không. Tôi đã sử dụng một mẫu kho lưu trữ trong lớp trình bày. Một điều cần lưu ý là mọi người thích ném trách nhiệm vào kho lưu trữ. Trước khi bạn biết điều đó, lớp kho lưu trữ của bạn sẽ nhảy múa, hát và làm tất cả mọi thứ. Bạn muốn tránh điều này.
Tôi đã thấy một lớp kho lưu trữ bắt đầu bằng cách có các trách nhiệm GetAll, GetById, Cập nhật và Xóa, điều này là tốt. Vào thời điểm dự án hoàn thành, cùng một lớp có hàng tá phương thức (trách nhiệm) đáng lẽ không bao giờ có ở đó. Ví dụ: GetByForename, GetBySurname, UpdateWithExinating và tất cả các loại công cụ điên rồ.
Đây là nơi các truy vấn và lệnh phát huy tác dụng.
3) Nếu bạn sử dụng ORM nhưng không phải mẫu lưu trữ, nơi bạn giữ các truy vấn thường được sử dụng. Sẽ là khôn ngoan khi biểu diễn mỗi truy vấn dưới dạng một lớp và có một số loại nhà máy truy vấn để tạo các thể hiện?
Tôi nghĩ rằng đó là một ý tưởng rất tốt để sử dụng các truy vấn và lệnh thay vì kho lưu trữ. Tôi làm như sau:
Xác định giao diện cho một truy vấn. Điều này sẽ giúp bạn kiểm tra đơn vị. Ví dụpublic interface IGetProductsByCategoryQuery { ... }
Xác định thực hiện cụ thể cho một truy vấn. Bạn sẽ có thể tiêm những thứ này thông qua khung IoC mà bạn chọn. Ví dụpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Bây giờ thay vì gây ô nhiễm kho lưu trữ với hàng tá trách nhiệm, tôi chỉ cần nhóm các truy vấn của mình thành các không gian tên. Ví dụ: giao diện cho truy vấn trên có thể tồn tại: Company.SolutionName.Products.Queries
và việc triển khai có thể ởCompany.SolutionName.Products.Queries.Implementation
Khi nói đến việc cập nhật hoặc xóa dữ liệu, tôi sử dụng mẫu lệnh theo cách tương tự.
Một số có thể không đồng ý và nói rằng trước khi dự án hoàn thành, bạn sẽ có hàng tá các lớp và không gian tên. Vâng, bạn sẽ làm vậy. Trong tâm trí tôi, đó là một điều tốt khi bạn có thể duyệt qua giải pháp trong IDE mà bạn chọn và ngay lập tức xem loại trách nhiệm nào mà thành phần nhất định có. Nếu bạn đã quyết định sử dụng một mẫu kho lưu trữ thay thế, bạn sẽ phải xem xét bên trong mỗi lớp kho lưu trữ để cố gắng thực hiện các trách nhiệm của nó.