Tổng hợp là một trong những khái niệm khó nhất trong DDD. Bạn có hầu hết nó đúng. Tôi đề nghị thể hiện khái niệm về "thành viên" trong tổng hợp là đơn giản hơn việc giới thiệu thuật ngữ "subobjects".
Có một đối tượng không thể là thành viên của nhiều tập hợp. Người nào sẽ là người thi hành cuối cùng? Một tổng hợp gốc có thể dễ dàng làm mất hiệu lực một người khác bằng cách xóa các thành viên và mồ côi các thành viên khác trong tổng hợp khác. Bạn là chính xác, trong các tình huống mà một đối tượng sẽ xuất hiện cần phải là thành viên trong nhiều tập hợp, đối tượng đó phải là một thực thể độc lập, tức là đối tượng đó trở thành gốc của tổng hợp mới. (Có thể hoặc không thể có thêm thành viên, nhưng nếu nó không có thì tất nhiên nó sẽ trở thành tổng hợp của riêng nó.)
Và có, hoàn toàn đúng là tổng hợp tồn tại để thực thi bất biến. Nó cũng là một đơn vị công việc hoặc một giao dịch duy nhất về sự kiên trì. Một gốc tổng hợp chịu trách nhiệm cuối cùng cho tất cả các bất biến trên toàn bộ thành viên của nó, đó là bởi vì, ví dụ, thất bại của một biến thể có thể gây ra sự thất bại, và tổng hợp chịu trách nhiệm duy trì tập hợp như một đơn vị duy nhất có thể tồn tại .
Tuy nhiên, và đây là một phần tinh tế và khó khăn, đó là trách nhiệm cuối cùng không có nghĩa là tổng hợp cũng là chính chấp hành viên là tốt. Giống như những gì chúng tôi có trong hệ thống tư pháp - tòa án cuối cùng là địa điểm cuối cùng nơi các vấn đề của pháp luật được xác định và quy tắc cuối cùng của luật được áp đặt, bất biến được thực thi. Nhưng thực thi thực tế (và tuân thủ) xảy ra ở nhiều cấp độ của hệ thống. Trong thực tế, trong một xã hội được sắp xếp tốt, hầu hết các hoạt động áp đặt luật lệ - thực thi các bất biến - phải diễn ra tốt trước khi bạn đến tòa án, và bạn không phải dựa vào việc thường xuyên ra tòa ngay cả. (Mặc dù trong DDD, bạn luôn có thể muốn có một gốc tổng hợp thực hiện việc quét bất biến cuối cùng trước khi ví dụ như sự kiên trì.)
Những gì bạn đang đề xuất là khác nhau, về cơ bản toàn bộ xã hội của bạn ngoại trừ tòa án bị giam giữ, và bạn dường như thậm chí còn đề xuất rằng những người khác thậm chí không thể truy cập, họ chỉ có thể chuyển một thông điệp tới tòa án và hy vọng rằng nó hoạt động một cách thích hợp.
Hãy xem điều gì xảy ra với miền của bạn nếu bạn đi theo đường dẫn bạn đã đề xuất. Mục tiêu là tạo ra một mô hình miền phong phú và mang tính biểu cảm.Về ngôn ngữ phổ biến có ý nghĩa, bạn đã giảm vốn từ vựng làm việc của mình chỉ với các gốc tổng hợp. Một thực thể được cho là được truy cập bởi root tổng hợp vì bất biến nhưng cũng bởi vì nếu thiết kế là đúng, thực thể có bản sắc có ý nghĩa phát sinh từ thành viên của nó trong bối cảnh gốc tổng hợp của nó. Nhưng đề xuất của bạn là một thực thể thậm chí không có bất kỳ danh tính loại nào ngoài gốc tổng hợp của nó. Evans đặc biệt nói rằng đó là một phần của mục đích của một gốc tổng hợp - để cho phép các đối tượng để có được tài liệu tham khảo cho các thành viên bằng traversal. Nhưng bạn không thể có được một tham chiếu hữu ích vì một đối tượng khác thậm chí không nhận thức được rằng các kiểu thành viên của bạn tồn tại. Hoặc bạn có thể thay đổi không gian tên nhưng điều đó không tốt hơn nếu bạn không cho phép truyền tải. Bây giờ toàn bộ miền của bạn biết về các loại, nhưng loại đối tượng mà không bao giờ có thể thu được.
Thậm chí tệ hơn là điều xảy ra với thư mục gốc tổng hợp của bạn. Một tổng hợp gốc thường nên có lý do riêng của nó cho sự tồn tại, ngoài việc duy trì tính toàn vẹn tổng hợp. Nhưng bây giờ danh tính đó không còn rõ ràng nữa. Nó bị che khuất bởi sự cần thiết phải có một phương thức bao bọc cho tất cả các phần tử khác nhau và các thuộc tính của chúng. Những gì bạn nhận được là những nguồn gốc tổng hợp không còn có tính biểu cảm hay thậm chí là một bản sắc rõ ràng, chỉ là những vật thể thần thánh khó sử dụng.
Ví dụ về Đơn đặt hàng và Đơn đặt hàng của bạn là một trường hợp thú vị tại điểm. Lệnh này không cung cấp việc thực thi một số bất biến mà OrderLine yêu cầu thay mặt cho OrderLine. Nó đang kiểm soát hành động trong trường hợp này để thực thi bất biến riêng của nó. Đó là một hành động hợp lệ để đặt kiểm soát ion của gốc tổng hợp. Tuy nhiên, thường tập hợp chủ yếu là có liên quan với việc tạo ra đối tượng và/hoặc phá hủy.
Chắc chắn không có yêu cầu mô hình imposea nơi tất cả các thay đổi trong tiểu bang phải tự động được áp dụng bởi gốc tổng hợp và không bao giờ trực tiếp. Trong thực tế, điều này thường là lý do tại sao gốc tổng hợp cho phép truyền tải để lấy tham chiếu tới các thành viên - vì vậy một đối tượng bên ngoài có thể áp dụng thay đổi trạng thái, nhưng trong bối cảnh tổng hợp điều khiển vòng đời của thực thể thành viên bị thay đổi.
Không chỉ hiển thị, mà còn tương tác thực tế với miền lớn hơn thường là cơ bản để phát triển mô hình phong phú và biểu cảm. Các tập hợp phục vụ để kiểm soát truy cập đó nhưng không phải để loại bỏ nó hoàn toàn.
Tôi hy vọng điều này sẽ giúp, đó là một khái niệm khó để thảo luận.
Bạn có thể giải thích ý bạn bằng "đối tượng phụ" không? Ý bạn là việc triển khai cụ thể các thực thể của bạn? Bạn có xem xét các lớp lồng nhau riêng để đạt được sự tách biệt sạch không? –
+1, Thú vị, nhưng câu hỏi không rõ ràng ngay với tôi khi tôi đọc nó. Bạn có thể thuật lại nó một chút và thay đổi tiêu đề không? Đây là câu hỏi tôi đã chưng cất: Làm thế nào để tôi có được sự tách biệt rõ ràng giữa các rễ tổng hợp trong cùng một assembly .NET? – Marijn