Chúng ta vẽ ranh giới giữa ủy quyền và đóng gói logic kinh doanh ở đâu? Dường như với tôi rằng chúng ta càng ủy thác, chúng ta càng trở nên thiếu máu . Tuy nhiên, phái đoàn cũng khuyến khích tái sử dụng và hiệu trưởng DRY. Vì vậy, những gì là phù hợp để ủy quyền và những gì nên còn lại trong các mô hình miền của chúng tôi?
Lấy các mối quan tâm sau đây làm ví dụ:
Ủy quyền . Đối tượng miền có nên chịu trách nhiệm duy trì các quy tắc kiểm soát truy cập của mình (chẳng hạn như thuộc tính CanEdit) hoặc nên được ủy quyền cho một thành phần / dịch vụ khác chịu trách nhiệm quản lý quyền truy cập, ví dụ: IAuthorizationService.CanEdit (object)? Hay nó nên là sự kết hợp của cả hai? Có lẽ đối tượng miền có thuộc tính CanEdit ủy quyền cho một IAuthorizationService nội bộ để thực hiện công việc thực tế?
Xác nhận . Các cuộc thảo luận tương tự như trên liên quan đến xác nhận. Ai duy trì các quy tắc và ai chịu trách nhiệm đánh giá chúng? Một mặt, trạng thái của đối tượng phải thuộc về đối tượng đó và tính hợp lệ là trạng thái nhưng chúng tôi không muốn viết lại mã được sử dụng để đánh giá các quy tắc cho mọi đối tượng miền. Chúng ta có thể sử dụng tính kế thừa trong trường hợp này ...
Tạo đối tượng . Lớp nhà máy so với phương thức nhà máy so với 'mới' lên một ví dụ. Nếu chúng ta sử dụng một lớp nhà máy riêng biệt, chúng ta có thể cô lập và đóng gói logic tạo nhưng với chi phí mở trạng thái đối tượng của chúng ta cho nhà máy. Điều này có thể được quản lý nếu lớp miền của chúng ta nằm trong một cụm riêng biệt bằng cách hiển thị một hàm tạo bên trong được sử dụng bởi nhà máy nhưng điều này trở thành một vấn đề nếu có nhiều mẫu tạo. Và, nếu tất cả các nhà máy đang làm là gọi đúng nhà xây dựng, thì điểm cần có của nhà máy là gì?
Các phương thức xuất xưởng trên lớp loại bỏ vấn đề mở ra trạng thái bên trong của đối tượng nhưng vì chúng là tĩnh, chúng ta không thể phá vỡ các phụ thuộc thông qua việc tiêm giao diện nhà máy như chúng ta có thể với một lớp nhà máy riêng biệt.
Kiên trì . Người ta có thể lập luận rằng nếu đối tượng miền của chúng tôi sẽ tiết lộ CanEdit trong khi ủy thác trách nhiệm thực hiện kiểm tra ủy quyền cho một bên khác (IAuthorizationService) tại sao không có phương thức Lưu trên đối tượng miền của chúng tôi cũng làm điều tương tự? Điều này sẽ cho phép chúng ta đánh giá trạng thái bên trong của đối tượng để xác định xem hoạt động có thể được thực hiện mà không phá vỡ đóng gói. Tất nhiên, nó yêu cầu rằng chúng ta tiêm phiên bản kho lưu trữ vào đối tượng miền của mình, điều này có mùi một chút đối với tôi, vì vậy chúng ta có đưa ra một sự kiện miền thay thế và cho phép một trình xử lý thực hiện thao tác bền bỉ không?
Xem tôi đang đi đâu với điều này?
Rockford Lhotka có một cuộc thảo luận tuyệt vời về lý do anh ấy đi theo lộ trình Class-in-Charge cho khung CSLA của anh ấy và tôi có một chút lịch sử với khung đó và có thể thấy ý tưởng của anh ấy về các đối tượng kinh doanh song song với các đối tượng miền theo nhiều cách. Nhưng cố gắng để trở nên gắn bó hơn với những lý tưởng DDD tốt, tôi tự hỏi khi sự hợp tác trở nên quá nhiều.
Nếu tôi kết thúc với một IAuthorizationService, IValidator, IFactory và IRep repository cho tổng hợp gốc của tôi, thì còn lại gì? Là có một phương thức Xuất bản thay đổi trạng thái của đối tượng từ Dự thảo thành Xuất bản đủ để coi lớp là một đối tượng miền không thiếu máu?
Suy nghĩ của bạn?