Trong cuộc tranh luận về các mô hình miền Rich vs Anemia, internet chứa đầy những lời khuyên triết học nhưng ngắn gọn về các ví dụ có thẩm quyền. Mục tiêu của câu hỏi này là tìm ra các hướng dẫn dứt khoát và các ví dụ cụ thể về các mô hình Thiết kế hướng miền thích hợp. (Lý tưởng nhất là trong C #.)
Đối với một ví dụ thực tế, việc triển khai DDD này dường như là sai:
Các mô hình miền WorkItem bên dưới không có gì ngoài các túi thuộc tính, được Entity Framework sử dụng cho cơ sở dữ liệu mã đầu tiên. Theo Fowler, nó là thiếu máu .
Lớp WorkItemService rõ ràng là một hiểu lầm phổ biến về Dịch vụ miền; nó chứa tất cả logic hành vi / nghiệp vụ cho WorkItem. Per Y Extremeanov và những người khác, nó là thủ tục . (trang 6)
Vì vậy, nếu dưới đây là sai, làm thế nào tôi có thể làm cho nó đúng?
Hành vi, tức là AddStatusUpdate hoặc Checkout , có nên thuộc lớp WorkItem đúng không?
Mô hình WorkItem nên có những phụ thuộc nào?
public class WorkItemService : IWorkItemService {
private IUnitOfWorkFactory _unitOfWorkFactory;
//using Unity for dependency injection
public WorkItemService(IUnitOfWorkFactory unitOfWorkFactory) {
_unitOfWorkFactory = unitOfWorkFactory;
}
public void AddStatusUpdate(int workItemId, int statusId) {
using (var unitOfWork = _unitOfWorkFactory.GetUnitOfWork<IWorkItemUnitOfWork>()) {
var workItemRepo = unitOfWork.WorkItemRepository;
var workItemStatusRepo = unitOfWork.WorkItemStatusRepository;
var workItem = workItemRepo.Read(wi => wi.Id == workItemId).FirstOrDefault();
if (workItem == null)
throw new ArgumentException(string.Format(@"The provided WorkItem Id '{0}' is not recognized", workItemId), "workItemId");
var status = workItemStatusRepo.Read(s => s.Id == statusId).FirstOrDefault();
if (status == null)
throw new ArgumentException(string.Format(@"The provided Status Id '{0}' is not recognized", statusId), "statusId");
workItem.StatusHistory.Add(status);
workItemRepo.Update(workItem);
unitOfWork.Save();
}
}
}
. chỉ có thể được xử lý bởi CRUD.)
Cập nhật
@AlexeyZimarev đã đưa ra câu trả lời hay nhất, một video hoàn hảo về chủ đề trong C # của Jimmy Bogard, nhưng rõ ràng nó đã được chuyển vào một bình luận bên dưới vì nó không cung cấp đủ thông tin ngoài liên kết. Tôi có một bản thảo sơ bộ các ghi chú của tôi tóm tắt video trong câu trả lời của tôi dưới đây. Xin vui lòng bình luận về câu trả lời với bất kỳ sửa chữa. Video dài một giờ nhưng rất đáng xem.
Cập nhật - 2 năm sau
Tôi nghĩ đó là dấu hiệu của sự trưởng thành non trẻ của DDD mà ngay cả sau khi nghiên cứu nó được 2 năm, tôi vẫn không thể hứa rằng mình biết "cách làm đúng". Ngôn ngữ phổ biến, nguồn gốc tổng hợp và cách tiếp cận của nó đối với thiết kế hướng hành vi là những đóng góp có giá trị của DDD cho ngành công nghiệp. Sự thiếu hiểu biết dai dẳng và tìm nguồn cung ứng sự kiện gây ra sự nhầm lẫn và tôi nghĩ triết lý như thế giữ nó lại từ việc áp dụng rộng rãi hơn. Nhưng nếu tôi phải thực hiện lại mã này, với những gì tôi đã học được, tôi nghĩ nó sẽ trông giống như thế này:
Tôi vẫn hoan nghênh bất kỳ câu trả lời nào cho bài đăng (rất tích cực) này cung cấp bất kỳ mã thực hành tốt nhất nào cho một mô hình miền hợp lệ.
"I don't want to duplicate all my entities into DTOs simply because I don't need it and it violates DRY, and I also don't want my client application to take a dependency on EntityFramework.dll"
. "Các thực thể" trong biệt ngữ Khung thực thể không giống như "Các thực thể" như trong "Mô hình miền"