Tôi xin lỗi trước nếu mọi người nghĩ rằng điều này đã bị đánh đến chết. Tôi đã chỉ dành vài giờ cuối cùng tìm kiếm và đọc nhiều bài viết tuyệt vời ở đây trong SO nhưng tôi vẫn còn bối rối.DDD, Repository & Encapsulation
Nguồn gây nhầm lẫn của tôi là DTO so với DDD và kho lưu trữ. Tôi muốn các đối tượng miền POCO của tôi có các đồ họa thông minh và tôi muốn lấy chúng từ các kho lưu trữ. Nhưng có vẻ như tôi phải vi phạm một số quy tắc đóng gói để thực hiện công việc đó, và có vẻ như nó có thể biến DTO lên đầu họ.
Dưới đây là một ví dụ đơn giản: Trong ứng dụng danh mục của chúng tôi, một phần có thể là một gói bao gồm một số phần khác. Vì vậy, nó có ý nghĩa đối với Part POCO để có một phương thức 'GetChildren()' trả về IEnumerable < Part>. Nó thậm chí có thể làm những thứ khác với danh sách trên đường ra.
Nhưng danh sách đó được giải quyết như thế nào? Có vẻ như kho là câu trả lời:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
Và
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
Bây giờ người tiêu dùng của các cửa hàng của tôi, ngoài việc (chính xác) phần tải từ kho, cũng có thể bỏ qua một số Part-đóng gói logic bằng cách gọi trực tiếp GetChildren (một phần). Điều đó có tệ không?
Tôi đọc các kho lưu trữ đó sẽ phân phát POCO nhưng DTO là tốt để chuyển dữ liệu 'giữa các lớp'. Rất nhiều thuộc tính phần được tính toán - ví dụ, được tính toán dựa trên các quy tắc định giá phức tạp. Một mức giá thậm chí sẽ không được trong một DTO đến từ một kho lưu trữ - vì vậy nó có vẻ như đi qua dữ liệu giá trở lại một dịch vụ web yêu cầu DTO để tiêu thụ một phần, không phải là cách khác xung quanh.
Quá trình này đã quá dài. Đầu của tôi bị tháo ra đâu?
Thú vị. Nhưng tôi bị nhầm lẫn bởi 'di chuyển GetChildren (một phần) vào IPartService và xóa nó khỏi phần' và sau đó 'Lớp Part vẫn có thuộc tính Childparts.' Điều gì sẽ xảy ra nếu một phần nhu cầu xoa bóp trẻ em vì một lý do nào đó? – n8wrl
Nếu việc xoa bóp cần phải xảy ra ngay lập tức khi bạn lấy nó từ kho lưu trữ, tôi sẽ đặt logic đó trong 'IPartService.GetChildren()'. Nếu bạn cần để có thể sửa đổi các phần con tại thời điểm tùy ý, bạn có thể thực hiện một phương thức dịch vụ khác, chẳng hạn như 'IPartService.UpdateChildPartPrices (Part part) .' (Hoặc cả hai - bạn có thể gọi' UpdateChildPartPrices' từ 'GetChildren'.) –
Cảm ơn bạn đã dành thời gian, Jeff! – n8wrl