2009-02-09 39 views
25

Tôi đã bắt đầu tìm hiểu về DDD và muốn biết người khác đã tổ chức các dự án của họ như thế nào.Làm thế nào để tổ chức một dự án thiết kế tên miền?

Tôi đã bắt đầu bằng cách tổ chức xung quanh AggregateRoots tôi:

MyApp.Domain (namespace cho mô hình miền)

MyApp.Domain.Product
- Sản phẩm
- IProductService
- IProductRepository
- v.v.

MyApp.Domain.Comment
- Bình luận
- ICommentService
- ICommentRepository
- vv

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository: IProductRepository
- v.v.

Sự cố tôi gặp phải với điều này là tôi phải tham chiếu sản phẩm miền của mình là MyApp.Domain.Product.Product hoặc Product.Product. Tôi cũng nhận được một cuộc xung đột với mô hình dữ liệu linq của tôi cho sản phẩm .... Tôi phải sử dụng các dòng mã xấu xí để phân biệt giữa hai loại như MyApp.Domain.Product.Product và MyApp.Respoitories.Product.

Tôi thực sự quan tâm để xem cách người khác đã tổ chức các giải pháp của họ cho DDD ...

Tôi đang sử dụng Visual Studio làm IDE của mình.

Cảm ơn rất nhiều.

Trả lời

19

tôi cố gắng giữ cho mọi thứ rất đơn giản bất cứ khi nào tôi có thể, vì vậy thường một cái gì đó như thế này làm việc cho tôi:

Myapp.Domain - lớp học Tất cả các lĩnh vực cụ thể chia sẻ không gian tên này

Myapp.Data - lớp mỏng mà tóm tắt cơ sở dữ liệu từ miền.

Myapp.Application - All "hỗ trợ mã", khai thác gỗ, chia sẻ mã tiện ích, người tiêu dùng dịch vụ vv

Myapp.Web - Giao diện web

Vì vậy, lớp học sẽ là ví dụ:

  • Myapp.Domain.Sales.Order
  • Myapp.Domain.Sales.Customer
  • Myapp.Domain.Pricelist
  • Myapp.Data.OrderManager
  • Myapp.Data.CustomerManager
  • Myapp.Application.Utils
  • Myapp.Application.CacheTools

vv

Ý tưởng tôi cố gắng ghi nhớ khi tôi đi cùng là các "miền" namespace là những gì chụp logic thực tế của ứng dụng. Vì vậy, những gì đi có những gì bạn có thể nói chuyện với các "chuyên gia miền" (Các dudes người sẽ sử dụng các ứng dụng) về. Nếu tôi viết mã gì đó vì điều gì đó mà họ đã đề cập, nó phải ở trong không gian tên miền và bất cứ khi nào tôi viết mã gì đó mà họ chưa đề cập (như đăng nhập, truy tìm lỗi, v.v) thì KHÔNG nên ở trong vùng tên miền.

Vì lý do này, tôi cũng cảnh giác về việc phân cấp đối tượng quá phức tạp. Lý tưởng nhất là một bản vẽ hơi đơn giản của mô hình miền nên được người lập trình hiểu trực giác.

Để kết thúc này, tôi thường không bắt đầu bằng cách suy nghĩ về các mẫu chi tiết. Tôi cố gắng mô hình hóa miền đơn giản như tôi có thể làm được, chỉ theo các hướng dẫn thiết kế hướng đối tượng tiêu chuẩn. Điều gì cần phải là một đối tượng? Họ có liên quan với nhau như thê nào? DDN trong tâm trí của tôi là về xử lý phần mềm phức tạp, nhưng nếu phần mềm của bạn không phải là rất phức tạp để bắt đầu, bạn có thể dễ dàng kết thúc trong một tình huống mà cách DDD làm việc thêm phức tạp hơn là loại bỏ nó.

Một khi bạn có một mức độ nhất định của sự phức tạp trong mô hình của bạn, bạn sẽ bắt đầu thấy cách thứ nhất định cần được tổ chức, và sau đó bạn sẽ biết được mô hình sử dụng, mà lớp học là uẩn, vv

Trong ví dụ của tôi , Myapp.Domain.Sales.Order sẽ là một gốc tổng hợp theo nghĩa là khi nó được instanced nó sẽ có khả năng chứa các đối tượng khác, chẳng hạn như một đối tượng khách hàng và tập hợp các dòng lệnh, và bạn sẽ chỉ truy cập các dòng lệnh cho đặt hàng thông qua đối tượng đặt hàng.

Tuy nhiên, để giữ mọi thứ đơn giản, tôi sẽ không có đối tượng "chính" chỉ chứa mọi thứ khác và không có mục đích khác, vì vậy lớp thứ tự sẽ có giá trị và thuộc tính hữu ích trong ứng dụng.

Vì vậy, tôi sẽ tham khảo những thứ như:

Myapp.Domain.Sales.Order.TotalCost

Myapp.Domain.Sales.Order.OrderDate

Myapp.Domain.Sales.Order.Customer .PreferredInvoiceMethod

Myapp.Domain.Sales.Order.Customer.Address.Zip

, vv

+0

Làm cho cảm giác ... Đặt hàng và khách hàng là bạn AggRoots phải không? Vì vậy, khi bạn tham khảo đối tượng đặt hàng của bạn, bạn phải làm điều đó như: Myapp.Domain.Sales.Order.Order ?? –

+0

Có và không - tôi đã mở rộng ví dụ của mình một chút, vì phần nhận xét hơi ngắn. – Console

+0

'Các lớp Manager' trong không gian tên' Data' làm cho tôi trở thành mô hình thiếu máu –

0

Tên miền của bạn có thể có tên , vì vậy bạn nên sử dụng tên làm không gian tên này.

Tôi tự động đặt kho triển khai và truy cập dữ liệu chi tiết trong không gian tên được gọi là Tính bền trong miền không gian tên.

Ứng dụng sử dụng tên riêng làm không gian tên.

5

Tôi thích có miền trong không gian tên thư mục gốc của ứng dụng, trong lắp ráp riêng của mình:

Acme.Core.dll [namespace root: Acme]

này gọn gàng đại diện cho thực tế là tên miền là trong phạm vi của tất cả các các phần khác của ứng dụng. (Để biết thêm, xem The Onion Architecture bởi Jeffrey Palermo).

Tiếp theo, tôi có một nhóm dữ liệu (thường là với NHibernate) ánh xạ các đối tượng miền tới cơ sở dữ liệu. Lớp này thực hiện kho và dịch vụ giao diện:

Acme.Data.dll [namespace root: Acme.Data]

Sau đó, tôi có một hội trình bày tuyên bố các yếu tố của tôi UI-mẫu-of-sự lựa chọn:

Acme.Presentation.dll [Root namespace : Acme.Presentation]

Cuối cùng, có dự án giao diện người dùng (giả sử ứng dụng web ở đây). Đây là nơi các thành phần của các yếu tố trong lớp trước diễn ra:

Acme.Web [Root namespace: Acme.Web]

0

tôi muốn kiểm tra codecampserver kể từ khi thiết lập có khá phổ biến.

Chúng có một dự án cốt lõi trong đó chúng bao gồm cả lớp ứng dụng và lớp miền. I E. bên trong của hành tây (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/).

Tôi thực sự muốn tách lõi ra thành các dự án riêng biệt để kiểm soát hướng phụ thuộc. Vì vậy, thường tôi có:

MyNamespace.SomethingWeb < - nhiều UIS
MyNamespace.ExtranetWeb < - nhiều UIS

MyNamespace.Application < - Evans' lớp ứng dụng với các lớp học như hậu mãi
MyNamespace.Domain

  • MyNamespace.Domain.Model < - đơn vị
  • MyNamespace.Dom ain.Services < - dịch vụ doman
  • MyNamespace.Domain.Repositories

MyNamespace.Infrastructure < - thực hiện repo, vv

MyNamespace.Common < - Một dự án mà tất cả các dự án khác có một phụ thuộc vào đó có những thứ như một Logger, Util lớp học, vv

3

Mặc dù bạn cũng là một. Net phát triển, các Java implementation reference of the cargo app từ DDD bởi Eric Evans và Citerus là một nguồn lực tốt.

Trong mã doc'd, bạn có thể xem tổ chức DDD thành ngữ cảnh và tập hợp được bao bọc trong hành động, ngay trong các gói Java.

Ngoài ra, bạn có thể xem xét Billy McCafferty's Sharp Architecture. Đó là một ASP.Net MVC, NHibernate/Fluent NHibernate thực hiện được xây dựng với DDD trong tâm trí.

Phải thừa nhận rằng, bạn sẽ vẫn cần áp dụng giải pháp thư mục/không gian tên để cung cấp ngữ cảnh. Tuy nhiên, cặp vợ chồng tiếp cận Evans với #Arch và bạn nên được tốt trên con đường của bạn.

Hãy cho chúng tôi biết bạn đang làm gì. Tôi cũng trên con đường tương tự, và không xa bạn!

Chúc mừng mã hóa,

Kurt Johnson

+0

CẬP NHẬT: Tôi nên thêm nhánh ngã ba có thể giúp đỡ (WCHM) của Kiến trúc Sharp. Tính đến tháng 9 năm 2010, các nhà bảo trì WCHM đã được đưa vào nhóm cộng tác viên cho Sharp. WCHM sắp xếp lại dự án Sharp Visual Studio vào các thư mục Solution, nó đề cập rõ ràng đến các khái niệm DDD. Có các thư mục cho miền (Cơ sở hạ tầng miền và miền cụ thể), bản trình bày (các khung nhìn web và các bộ điều khiển web), khung (mã được xem xét có thể sử dụng lại trên các tên miền và một tầng dịch vụ (Nhiệm vụ). . –

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