2009-09-25 36 views
5

Sau khi đọc Thiết kế điều khiển miền của Eric Evans, tôi có một vài câu hỏi. Tôi tìm kiếm nhưng không có nơi tôi có thể tìm thấy câu trả lời thỏa mãn. Vui lòng cho tôi biết nếu bất kỳ ai trong các bạn có sự hiểu biết rõ ràng bên dưới các câu hỏi.Các câu hỏi liên quan đến Thiết kế điều khiển miền

mối quan tâm của tôi là

  1. Repository là để nhận uẩn đã tồn tại từ DB, dịch vụ Web. Nếu có, Kho lưu trữ có thể có lệnh giao dịch trên thực thể này (ví dụ: Số tiền chuyển khoản, gửi chi tiết tài khoản ... vv)

  2. Thực thể có phương thức gọi là dịch vụ lớp cơ sở hạ tầng để gửi email. .vv .. (Các phương thức thực thể gọi các dịch vụ IS direclty).

  3. Thực hiện kho lưu trữ và Lớp nhà máy sẽ nằm trong Lớp cơ sở hạ tầng. đó là tuyên bố đúng?

  4. Gọi tầng UI (bộ điều khiển) có thể gọi trực tiếp phương pháp tích hợp không? hoặc chúng ta nên gọi chúng từ lớp Ứng dụng?

Hiện vẫn còn rất nhiều nhiều nhầm lẫn trong tâm trí tôi ... xin vui lòng hướng dẫn cho tôi ... Sách tôi đang sử dụng tên miền hướng desing Eric Evan của ...... NET Domain-Driven Design với C#

Trả lời

13
  1. Có rất nhiều cuộc tranh luận về việc liệu kho lưu trữ có nên chỉ đọc hoặc cho phép giao dịch hay không. DDD không quyết định bất kỳ quan điểm nào trong số này. Bạn có thể làm cả hai. Những người ủng hộ kho lưu trữ chỉ đọc thích Đơn vị công việc cho tất cả các hoạt động CUD.

  2. Hầu hết mọi người (tự bao gồm) đều coi việc thực hành tốt là các thực thể là không đáng kể. Việc mở rộng nguyên tắc đó một chút sẽ cho thấy rằng chúng nên được khép kín và miễn phí cho tất cả các dịch vụ tầng cơ sở hạ tầng - ngay cả ở dạng trừu tượng. Vì vậy, tôi sẽ nói rằng các cuộc gọi đến các dịch vụ cơ sở hạ tầng thuộc về các lớp dịch vụ hoạt động trên các thực thể.

  3. Có vẻ đúng là việc triển khai và nhà máy Repository (nếu có) nên nằm trong lớp cơ sở hạ tầng. Tuy nhiên, giao diện của chúng phải nằm trong Lớp Miền sao cho các dịch vụ miền có thể tương tác với chúng mà không cần phụ thuộc vào lớp cơ sở hạ tầng.

  4. DDD không thực sự ra lệnh cho dù bạn có thể bỏ qua các lớp hay không. Cuối trong cuốn sách, Evans nói một chút về phân lớp và gọi nó là Relaxed Layering khi bạn cho phép điều này, vì vậy tôi đoán anh ta chỉ xem nó như là một lựa chọn trong một số. Cá nhân tôi muốn ngăn chặn lớp bỏ qua, bởi vì nó làm cho nó dễ dàng hơn để tiêm một số hành vi tại một thời gian trong tương lai nếu các cuộc gọi đã đi qua các lớp chính xác.

+2

Từ quan điểm của tôi có điều gì đó sai trái với tuyên bố 3. Trách nhiệm nhà máy là để tạo ra các đối tượng, do đó nếu nhà máy nằm trong lớp Persistence thì thực thể cũng phải nằm trong lớp persistence (nếu không nguyên tắc nghịch đảo phụ thuộc sẽ bị hỏng - nó không đủ để nhà máy biết trừu tượng của thực thể, nó cần phải biết việc thực hiện cụ thể) . Nhưng làm cách nào để triển khai thực thể nằm trong lớp Persistence? Thực thể không phải là DTO, nó chứa rất nhiều logic miền! – diegomtassis

+1

Có lẽ những giải thích chi tiết này sẽ giúp: http://stackoverflow.com/a/9503612/126014 http://blog.ploeh.dk/2013/12/03/layers-onions-ports-adapters-its-all-the -same –

9
  1. Cá nhân, trong DDD dự án mới nhất của tôi, tôi sử dụng một đơn vị công việc mà tổ chức một phiên NHibernate. UoW là ctor được tiêm trong các kho, tạo cho chúng duy nhất chịu trách nhiệm Add, Remove và Find.

  2. Evans đã tuyên bố rằng một phần của câu đố bị thiếu trong sách DDD là «Sự kiện miền». Sử dụng một cái gì đó như Udi Dahan's DomainEvents sẽ cung cấp cho bạn một kiến ​​trúc hoàn toàn tách rời (đối tượng miền chỉ đơn giản là đặt ra một sự kiện).Cá nhân, tôi sử dụng một phiên bản sửa đổi của sự kiện miền và StructureMap cho hệ thống dây điện. Nó hoạt động tốt cho nhu cầu của tôi.

  3. Tôi khuyên bạn nên dựa trên các đề xuất khác, giao diện Repository là một phần của mô hình và triển khai của chúng là một phần của cơ sở hạ tầng.

  4. Có! Cá nhân tôi đã làm việc trên ba dự án web DDD, nơi các dịch vụ và kho được tiêm vào trình bày/bộ điều khiển (ASP.NET/ASP.NET MVC) và nó có ý nghĩa rất nhiều trong ngữ cảnh của chúng ta.

+0

Cảm ơn Martin, vì đề xuất của bạn ...... tôi nghĩ rằng tôi phải bắt đầu thực hiện thiết kế thay vì suy nghĩ nhiều DDD, tôi cho rằng thiết kế Miền của tôi sẽ nhận được manu iterations khi tôi bắt đầu xây dựng ứng dụng – batwadi

+0

Tôi đồng ý với ý tưởng về các giao diện kho lưu trữ trong mô hình miền và các triển khai trong lớp kiên trì, nhưng các nhà máy thì sao? – diegomtassis

1
  1. Các kho chỉ nên được định vị và tiết kiệm thực thể, không nên có bất kỳ logic kinh doanh trong lớp đó. Ví dụ:

    repository.TransferAmount (số tiền, toAccount); // điều này là xấu

  2. Thực thể có thể làm những việc như gửi email miễn là chúng phụ thuộc vào trừu tượng được xác định trong miền của bạn. Việc triển khai phải nằm trong lớp cơ sở hạ tầng của bạn.

  3. Có, bạn đặt triển khai kho lưu trữ trong lớp cơ sở hạ tầng của mình.

  4. Gọi tầng UI (bộ điều khiển) có thể gọi trực tiếp phương pháp tích hợp không? hoặc chúng ta nên gọi chúng từ lớp Ứng dụng?

Vâng, tôi cố gắng làm theo mô hình này cho hầu hết các phần:

[UnitOfWork] 
public ActionResult MyControllerAction(int id) 
{ 
    var entity = repository.FindById(id); 
    entity.DoSomeBusinessLogic(); 
    repository.Update(entity); 
} 
Các vấn đề liên quan