2011-08-23 32 views
15

Tôi lần đầu tiên bị chân với DDD (trong. Net) lần đầu tiên, vì tôi đang kiến ​​trúc lại một số thành phần cốt lõi của ứng dụng doanh nghiệp cũ.DDD và thực hiện sự bền bỉ

Điều tôi muốn làm rõ là, làm cách nào để chúng tôi triển khai sự kiên trì trong kiến ​​trúc DDD phù hợp?

Tôi nhận ra rằng bản thân các tên miền đều không biết gì, và nên được thiết kế bằng cách sử dụng "ngôn ngữ phổ biến" và chắc chắn không bị ép buộc vào DAC của tháng hoặc thậm chí cơ sở dữ liệu vật lý.

Tôi có đúng là Giao diện kho lưu trữ nằm trong hội đồng miền hay không, nhưng việc triển khai lại có tồn tại trong lớp kiên trì không? Lớp persistence chứa tham chiếu đến lớp Domain, không bao giờ ngược lại?

Phương thức lưu trữ thực tế của tôi (CRUD) được gọi từ đâu?

Trả lời

10

Tôi có đúng là Giao diện kho lưu trữ nằm trong miền , nhưng triển khai kho lưu trữ tồn tại trong lớp kiên trì không? Lớp persistence chứa tham chiếu đến lớp Miền, không bao giờ ngược lại?

Vâng, đây là một cách tiếp cận rất tốt.

Phương thức lưu trữ thực tế của tôi (CRUD) được gọi từ đâu?

Có thể là một ý tưởng hay khi không suy nghĩ về CRUD vì nó quá tập trung vào dữ liệu và có thể dẫn bạn vào Generic Repository Trap. Repository giúp quản lý trung và cuối cuộc đời cho domain objects. Factories thường có trách nhiệm bắt đầu. Hãy nhớ rằng khi đối tượng được khôi phục từ cơ sở dữ liệu, nó đang ở giai đoạn giữa cuộc sống của nó từ quan điểm DDD. Đây là cách mã có thể trông giống như:

// beginning 
Customer preferredCustomer = CustomerFactory.CreatePreferred(); 
customersRepository.Add(preferredCustomer); 

// middle life 
IList<Customer> valuedCustomers = customersRepository.FindPrefered(); 

// end life 
customersRepository.Archive(customer); 

Bạn có thể gọi mã này trực tiếp từ ứng dụng của mình. Nó có thể đáng để tải xuống và xem xét số DDD Sample của Evan. Mẫu Unit of Work thường được sử dụng để xử lý các giao dịch và trừu tượng ORM của bạn về lựa chọn.

+3

Tôi đồng ý với mọi thứ mà Dmitry đã nói ở đây, điều duy nhất tôi muốn thêm là tôi khuyên bạn nên tham khảo dự án khách hàng/UI của bạn một lớp 'Ứng dụng dịch vụ', yêu cầu các phương thức trên miền (tổng hợp miền hoặc miền) dịch vụ) và gọi các kho lưu trữ từ đây. Bằng cách này tất cả các logic được chứa trong dịch vụ ứng dụng này, và bạn có thể thay đổi/thêm các giao diện người dùng với ít nỗ lực. –

+1

Tôi sẽ chỉ thêm một lớp dịch vụ khi nó có lợi ích rõ ràng cho ứng dụng, không chỉ vì lợi ích của nó. Một lớp dịch vụ là một lớp trừu tượng bổ sung mà trong nhiều trường hợp bạn có thể làm mà không cần. –

+0

@RobinvanderKnaap, điều đó không đúng, lớp Dịch vụ ứng dụng được yêu cầu mọi lúc, trong tình huống phát triển phần mềm trong thế giới thực. Nếu bạn giao cho nhóm phát triển UI lớp miền, có thể a) không biết cách sử dụng nó, b) có thể lạm dụng nó. Bạn cần phải rõ ràng về những gì giao diện người dùng có thể làm với API doanh nghiệp của bạn (Lớp miền). –

2

Kiểm tra xem Steve Bohlenhas to say về chủ đề này là gì. Mã cho bản trình bày có thể được tìm thấy here.

Tôi đã thuyết trình và tìm thấy thông tin về cách tạo mô hình kho tốt.

+0

Rất đẹp, chắc chắn là phần giới thiệu thẳng thắn nhất về DDD mà tôi đã từng xem. Các mã là tốt đẹp bởi vì nó không phải là bogged xuống với ống nước ưa thích giống như nhiều ví dụ khác ra khỏi đó. Thật không may, nó là một chút ánh sáng trên khía cạnh thực tế của sự vật, mà tôi đã thực sự cố gắng để được giúp đỡ. – EkoostikMartin

0

Tôi có đúng là Giao diện kho lưu trữ nằm trong miền , nhưng triển khai kho lưu trữ tồn tại trong lớp kiên trì không? Lớp persistence chứa tham chiếu đến lớp Miền, không bao giờ ngược lại?

Tôi không đồng ý ở đây, chúng ta hãy nói một hệ thống bao gồm các lớp sau:

  • Presentation Layer (giành chiến thắng hình thức, hình thức web, asp.net MVC, WPF, php, qt, java,, ios, android, v.v.)
  • Business Layer (đôi khi được gọi là người quản lý hoặc dịch vụ, logic goes here)
  • Resource Access Layer (bằng tay hoặc ORM)
  • Resource/Storage (RDBMS, NoSQL vv)

Giả định ở đây là bạn càng có nhiều lớp dễ bay hơi (cao nhất là bản trình bày và thấp nhất là tài nguyên/lưu trữ). Đó là vì điều này mà bạn không muốn lớp truy cập tài nguyên tham chiếu lớp kinh doanh, nó là một cách khác xung quanh! Lớp nghiệp vụ tham chiếu lớp truy cập tài nguyên, bạn gọi DOWN không lên!

Thay vào đó, bạn đặt giao diện/hợp đồng trong hội đồng của riêng mình, chúng hoàn toàn không có mục đích trong lớp nghiệp vụ.

Các vấn đề liên quan