2012-10-13 16 views
10

Là một phần của mô hình miền của tôi, giả sử tôi có đối tượng WorkItem. Các đối tượng WorkItem có nhiều mối quan hệ để tra cứu giá trị như:Giá trị tra cứu có nên được mô hình hóa dưới dạng tổng hợp không?

WorkItemType:

  • UserStory
  • Bug
  • Enhancement

Priority:

  • cao
  • Medium
  • thấp

Và có thể có thể được nhiều hơn, chẳng hạn như Status, Severity, vv ...

DDD khẳng định rằng nếu một cái gì đó tồn tại trong một gốc tổng hợp mà bạn shouldn không cố gắng truy cập nó bên ngoài gốc tổng hợp. Vì vậy, nếu tôi muốn có thể thêm các WorkItemTypes mới như Task, hoặc các ưu tiên mới như Critical, các giá trị tra cứu đó có cần phải là các nguồn tổng hợp với các kho lưu trữ riêng của chúng không? Điều này có vẻ hơi quá mức đặc biệt nếu chúng chỉ là một cặp giá trị quan trọng. Làm cách nào để tôi cho phép người dùng sửa đổi các giá trị này và vẫn tuân thủ quy tắc đóng gói gốc tổng hợp?

Trả lời

6

Landon, tôi nghĩ rằng cách duy nhất là làm cho các cặp giá trị đó tổng hợp rễ. Tôi biết rằng có thể trông quá mức cần thiết, nhưng đó là những thứ phanh DDD thành những thành phần nhỏ.

Những lý do tại sao tôi nghĩ rằng sử dụng một kho lưu trữ được một cách đúng đắn là:

  • Một người sử dụng cần để có thể thêm những cặp giá trị độc lập của một hạng mục công trình.
  • Các cặp giá trị không có một địa phương, bản sắc độc đáo

Hãy nhớ rằng DDD chỉ là một tập hợp các hướng dẫn, không phải sự thật khó khăn. Nếu bạn nghĩ rằng điều này là quá mức cần thiết, bạn có thể muốn tạo một tra cứu trả về các cặp như các đối tượng giá trị. Điều này có thể làm việc đặc biệt nếu bạn không có một tính năng để thêm cặp giá trị trong ứng dụng, mà là thông qua cơ sở dữ liệu.

Là một lưu ý phụ, câu hỏi hay! Có khá nhiều bài đăng trên blog về tình huống này ... Nhưng không phải tất cả đều đồng ý về cách tốt nhất để làm điều này.

+0

Trong trường hợp của tôi, ứng dụng không cần phải sửa đổi các giá trị tra cứu. Tôi đoán mô hình hóa các đối tượng này như tổng hợp dường như có ý nghĩa. Vaughn Vernon có giải thích về cách những tập hợp này có thể làm việc cùng nhau trong bài viết này (http://dddcommunity.org/sites/default/files/pdf_articles/Vernon_2011_2.pdf). Ở dưới cùng của trang 8, ông đề cập rằng bạn có thể có một dịch vụ ứng dụng giải quyết các phụ thuộc. Ông cũng nói rằng nếu các truy vấn trở nên quá tốn kém, bạn có thể sử dụng một số CQRS. –

4

Không phải mọi thứ đều được mô hình hóa bằng DDD. Sự phức tạp của việc quản lý dữ liệu tham chiếu rất có thể sẽ không biện minh cho việc tạo ra các nguồn tổng hợp. Một giải pháp phổ biến là sử dụng CRUD để quản lý dữ liệu tham chiếu và có Dịch vụ miền để giao tiếp với dữ liệu đó từ miền.

8

Trong khi mẫu kho lưu trữ như được mô tả trong blue book không nhấn mạnh việc sử dụng nó là độc quyền cho tập hợp, nó để lại phòng mở cho trường hợp ngoại lệ.Để trích dẫn cuốn sách:

Mặc dù hầu hết các truy vấn trả về một đối tượng hoặc một bộ sưu tập của các đối tượng, nó cũng phù hợp trong khái niệm để trở về một số loại tóm tắt tính toán, chẳng hạn như một số đối tượng, hoặc một tổng của một số thuộc tính được dự định bởi mô hình để được kiểm tra. (pg. 152)

Điều này nói rằng kho lưu trữ có thể được sử dụng để trả về thông tin tóm tắt, không phải là tổng hợp. Ý tưởng này mở rộng để sử dụng một kho lưu trữ để tìm kiếm các đối tượng giá trị, giống như trường hợp sử dụng của bạn yêu cầu.

Một điều cần xem xét là read-model pattern về cơ bản cho phép loại truy vấn chỉ có kho lưu trữ có hiệu quả tách mẫu mô hình miền hành vi khỏi mối quan tâm truy vấn.

+0

+1 để chỉ ra rằng một Kho lưu trữ không phải lúc nào cũng phải trả lại một thư mục tổng hợp. Ngoài ra đối với liên kết đến mẫu mô hình đọc và giải thích cách nó khác với CQRS vì nó chia sẻ cùng một cơ sở dữ liệu. Vì ứng dụng của tôi yêu cầu thay đổi dữ liệu và không chỉ đọc, tôi đã quyết định biến chúng thành tập hợp và có thể sử dụng mô hình đọc hoặc dịch vụ ứng dụng để tạo các liên kết giữa các tập hợp. –

2

Những tra cứu này có ID không? Nếu không, bạn có thể xem xét việc đặt chúng Value Objects ...

+2

Họ có các ID và được chia sẻ bởi các cá thể tổ chức khác nhau để chúng không phải là Đối tượng giá trị. –