Hãy tưởng tượng tôi có một Nhóm và Người dùng và khi người dùng muốn tham gia một nhóm, tôi đang gọi phương thức của nhómService.AddUserTogroup (nhóm, người dùng). Trong DDD tôi nên làm nhóm.JoinUser (người dùng), trông khá tốt.
Nhưng DDD cũng khuyến khích bạn sử dụng các dịch vụ (không trạng thái) để thực hiện các nhiệm vụ, nếu nhiệm vụ trong tay quá phức tạp hoặc không phù hợp với mô hình thực thể. Bạn có thể có các dịch vụ trong lớp miền. Nhưng các dịch vụ trong lớp miền chỉ nên bao gồm logic nghiệp vụ. Mặt khác, các tác vụ bên ngoài và logic ứng dụng (như gửi email), nên sử dụng dịch vụ miền trong lớp ứng dụng, trong đó bạn có thể có một dịch vụ (ứng dụng-) riêng biệt.
Vấn đề xuất hiện nếu tôi có một số quy tắc xác thực để thêm người dùng ...
Các quy tắc xác nhận không thuộc về mô hình miền! Chúng nên được gói gọn bên trong các đối tượng miền (thực thể, v.v.).
... hoặc một số tác vụ bên ngoài cần được bắt đầu khi người dùng được thêm vào nhóm. Có những nhiệm vụ này sẽ dẫn đến thực thể có phụ thuộc bên ngoài.
Mặc dù tôi không biết bạn đang nói về loại nhiệm vụ bên ngoài nào, tôi cho rằng nó giống như gửi email, v.v. Nhưng đây không thực sự là một phần của mô hình miền của bạn. Nó sẽ sống trong lớp ứng dụng và được hanlded ở đó imho. Bạn có thể có một dịch vụ trong lớp ứng dụng hoạt động trên các dịch vụ và thực thể miền để thực hiện các tác vụ đó.
Nhưng thực tế là một Thực thể phụ thuộc vào một số dịch vụ / lớp học bên ngoài có vẻ không tốt và "tự nhiên" đối với tôi.
Điều đó là không tự nhiên và không nên xảy ra. Các thực thể không nên biết về những thứ không phải là trách nhiệm của nó. Dịch vụ nên được sử dụng để phối hợp các tương tác thực thể.
Cách thích hợp để giải quyết vấn đề này trong DDD là gì?
Trong trường hợp của bạn, mối quan hệ có lẽ nên là hai chiều. Việc người dùng tham gia nhóm hay nhóm lấy người dùng tùy thuộc vào tên miền của bạn. Người dùng có tham gia nhóm không? Hoặc là người dùng được thêm vào một nhóm? Làm thế nào nó hoạt động trong miền của bạn?
Dù sao, bạn có mối quan hệ hai chiều và do đó có thể xác định số lượng nhóm người dùng đã thuộc về tổng hợp người dùng. Cho dù bạn chuyển người dùng cho nhóm hoặc nhóm cho người dùng về mặt kỹ thuật là một khi bạn đã xác định được lớp chịu trách nhiệm.
Việc xác nhận nên được thực hiện bởi các thực thể. Toàn bộ điều được gọi từ một dịch vụ của lớp ứng dụng cũng có thể thực hiện các công cụ kỹ thuật, như gửi email, v.v.
Tuy nhiên, nếu logic xác thực thực sự phức tạp, một dịch vụ miền có thể là một giải pháp tốt hơn. Trong trường hợp đó, đóng gói các quy tắc kinh doanh trong đó và sau đó gọi nó từ lớp ứng dụng của bạn.