2009-10-01 5 views
5

Tôi đang cố gắng triển khai DDD lần đầu tiên với dự án ASP.NET MVC và tôi đang đấu tranh với một vài thứ.Thiết kế điều khiển tên miền: Khi nào cần tạo một gốc tổng hợp?

Tôi có 2 thực thể liên quan, Công ty và Nhà cung cấp. Ý nghĩ ban đầu của tôi là Công ty là một gốc tổng hợp và Nhà cung cấp đó là một đối tượng giá trị cho Công ty. Vì vậy, tôi có một Kho lưu trữ cho công ty và không có cho Nhà cung cấp.

Nhưng khi tôi bắt đầu xây dựng ứng dụng của mình, tôi đã cần danh sách riêng, tạo và cập nhật biểu mẫu cho Nhà cung cấp. Danh sách rất dễ dàng tôi có thể gọi Company.Suppliers, và tạo ra là khủng khiếp tôi có thể làm Company.Suppliers.Add (nhà cung cấp), nhưng cập nhật là cho tôi một nhức đầu. Vì tôi chỉ cần một thực thể và tôi không thể chính xác dính vào bộ nhớ giữa các biểu mẫu, tôi đã cần phải tìm nạp lại công ty và tất cả các nhà cung cấp và tìm một công ty tôi cần để liên kết với nó và một lần nữa sửa đổi và duy trì nó trở lại db.

Tôi thực sự chỉ cần thực hiện GetOne nếu tôi có kho lưu trữ cho Nhà cung cấp. Tôi có thể thêm một số công việc xung quanh bằng cách thêm một GetOneSupplier vào công ty của tôi hoặc CompanyRepository, nhưng điều đó có vẻ như junky.

Vì vậy, tôi thực sự tự hỏi nếu nó thực sự là một đối tượng giá trị, và không phải là một thực thể tên miền đầy đủ chính nó.

tldr;

Có cần danh sách/tạo/cập nhật chế độ xem/trang riêng biệt một dấu hiệu cho thấy một thực thể phải là gốc của chính nó không?

Trả lời

34

Dựa trên thuật ngữ của bạn, tôi cho rằng bạn đang thực hiện DDD dựa trên sách của Eric Evans. Nghe có vẻ như bạn đã xác định được một vấn đề với bước đi đầu tiên của bạn về mô hình hóa và bạn đã đúng.

Bạn đề cập đến bạn nghĩ về nhà cung cấp dưới dạng Value Object ... Tôi đề xuất không. Một Value Object là một cái gì đó chủ yếu được xác định bởi các thuộc tính của nó. Ví dụ: ngày "ngày 30 tháng 9 năm 2009" là một đối tượng giá trị. Tại sao? Bởi vì tất cả các trường hợp ngày tháng với một kết hợp tháng/ngày/năm khác nhau là các ngày khác nhau. Tất cả các phiên ngày có cùng một kết hợp tháng/ngày/năm được coi là giống hệt nhau. Chúng tôi sẽ không bao giờ tranh cãi về việc hoán đổi "ngày 30 tháng 9 năm 2009" của tôi vì chúng giống nhau :-)

Mặt khác chủ yếu được xác định bằng "ID" của nó. Ví dụ: tài khoản ngân hàng có ID - tất cả đều có số tài khoản. Nếu có hai tài khoản tại một ngân hàng, mỗi tài khoản có 500 đô la, nếu số tài khoản của họ khác nhau, thì chúng cũng vậy. Các thuộc tính của chúng (trong ví dụ này, số dư của chúng) không xác định chúng hoặc ngụ ý sự bình đẳng.Tôi đặt cược chúng tôi sẽ tranh luận về việc trao đổi tài khoản ngân hàng ngay cả khi số dư của họ là như nhau :-)

Vì vậy, trong ví dụ của mình, tôi sẽ xem xét nhà cung cấp. hơn thuộc tính của nó. Công ty của riêng tôi chia sẻ tên của nó với hai người khác trên thế giới - nhưng chúng tôi không phải là tất cả hoán đổi cho nhau.

Tôi nghĩ rằng đề nghị của bạn là nếu bạn cần quan điểm cho CRUD một đối tượng thì đó là Entity có thể đúng như quy tắc chung, nhưng bạn nên tập trung hơn vào những gì làm cho một đối tượng khác với đối tượng khác: thuộc tính hoặc ID.

Bây giờ theo như Aggregate Root đi, bạn muốn tập trung vào vòng đời và kiểm soát truy cập của các đối tượng. Hãy xem xét rằng tôi có một blog với nhiều bài đăng có nhiều nhận xét - ở đâu là/là Aggregate Root (s)? Hãy bắt đầu với ý kiến. Có ý nghĩa để có một bình luận mà không có một bài viết? Bạn sẽ tạo một bình luận, sau đó đi tìm một bài viết và đính kèm nó vào nó? Nếu bạn xóa bài đăng, bạn có giữ lại nhận xét của mình không? Tôi đề xuất một bài đăng là Aggregate Root với một "lá" - nhận xét. Bây giờ hãy xem xét chính blog đó - mối quan hệ của nó với các bài đăng của nó tương tự như giữa các bài đăng và nhận xét. Nó cũng theo tôi là Aggregate Root với một "lá" - bài viết. Vì vậy, trong ví dụ của bạn, có mối quan hệ mạnh mẽ giữa công ty và nhà cung cấp theo đó nếu bạn xóa một công ty (tôi biết ... bạn có thể chỉ có một trường hợp công ty), bạn cũng sẽ xóa nhà cung cấp của mình? Nếu bạn xóa "Starbucks" (một công ty cà phê ở Mỹ) thì tất cả các nhà cung cấp hạt cà phê của nó có ngừng tồn tại không? Tất cả điều này phụ thuộc vào miền và ứng dụng của bạn, nhưng tôi khuyên bạn không nên để Entities của mình là Aggregate Roots hoặc có lẽ cách tốt hơn để nghĩ về chúng là chúng là Tổng hợp các gốc không có "lá" (không có gì để tổng hợp). Nói cách khác, công ty không kiểm soát việc truy cập hoặc kiểm soát vòng đời của các nhà cung cấp. Nó đơn giản có mối quan hệ một-nhiều với các nhà cung cấp (hoặc có thể là nhiều người).

Điều này mang lại cho chúng tôi Repositories. A Repository để lưu trữ và truy xuất Aggregate Roots. Bạn có hai (về mặt kỹ thuật, chúng không tập hợp bất cứ thứ gì nhưng dễ hơn là nói "kho chứa gốc tổng hợp hoặc các thực thể không nằm trong tổng hợp"), do đó bạn cần hai Repositories. Một cho công ty và một cho các nhà cung cấp.

Tôi hy vọng điều này sẽ hữu ích. Có lẽ Eric Evans ẩn nấp ở đây và sẽ cho tôi biết nơi tôi đã đi lệch khỏi mô hình của anh ta.

+0

Câu trả lời thú vị! Bạn đã giúp xác nhận những gì tôi đã suy nghĩ và giải thích nhiều hơn nữa. Cảm ơn bạn rất nhiều! Tôi đồng ý, sẽ có chia sẻ được tham chiếu tới nhà cung cấp nếu chúng tồn tại, nhưng trong thời điểm người dùng nhập dữ liệu không có cách nào để xác thực rằng 2 nhà cung cấp là giống nhau. Điều đó có thể thay đổi trong tương lai khi hệ thống phát triển, nhưng bây giờ đó là câu chuyện. Cảm ơn một lần nữa! –

+0

Tôi đồng ý đây là một lời giải thích tuyệt vời, hữu ích hơn những gì tôi thường thấy trong danh sách gửi thư DDD! –

+0

Câu trả lời sáng chói. Một phiếu bầu từ tôi. –

1

Có vẻ như không có trí tuệ với tôi - Nhà cung cấp phải có kho lưu trữ riêng. Nếu có bất kỳ khả năng logic nào mà một thực thể có thể tồn tại độc lập trong mô hình thì nó phải là một thực thể gốc, nếu không bạn sẽ chỉ kết thúc tái cấu trúc sau này, đó là công việc dư thừa.

Thực thể gốc luôn linh hoạt hơn đối tượng giá trị, mặc dù việc triển khai bổ sung hoạt động ở phía trước. Tôi thấy rằng các đối tượng giá trị trong một mô hình trở nên hiếm hơn theo thời gian khi mô hình tiến hóa, và các thực thể vẫn là các đối tượng giá trị thường là các đối tượng mà bạn có thể ràng buộc theo cách đó từ ngày đầu.

Nếu các công ty chia sẻ nhà cung cấp sau đó có nhà cung cấp dưới dạng thực thể gốc, hãy xóa dữ liệu dự phòng cho mỗi công ty nhưng chia sẻ tham chiếu thay thế. tốt, có thể mang lại nhiều lợi ích hơn.

+0

Cảm ơn bạn đã trả lời rất rõ ràng, điều đó cũng hữu ích. –