33

私は DDD について学び始めたので、他の人がどのようにプロジェクトを編成したか知りたいと思っていました。

AggregateRoots を整理することから始めました。

MyApp.Domain (ドメイン モデルの名前空間)

MyApp.Domain.Product
- 製品
- IProductService
- IProductRepository
- など

MyApp.Domain.Comment
- コメント
- ICommentService
- ICommentRepository
- など

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository : IProductRepository
- など

これで遭遇した問題は、ドメイン製品を MyApp.Domain.Product.Product または Product.Product として参照する必要があることです。また、製品の linq データ モデルと競合します....MyApp.Domain.Product.Product と MyApp.Respoitories.Product などの 2 つを区別するために、醜いコード行を使用する必要があります。

他の人がどのように DDD のソリューションを構成しているかを知りたいです...

IDE として Visual Studio を使用しています。

どうもありがとう。

4

5 に答える 5

23

私はできる限り物事を非常にシンプルに保つように努めているため、通常は次のような方法でうまくいきます。

Myapp.Domain - ドメイン固有のすべてのクラスがこの名前空間を共有します

Myapp.Data - ドメインからデータベースを抽象化するシン レイヤー。

Myapp.Application - すべての「サポート コード」、ロギング、共有ユーティリティ コード、サービス コンシューマなど

Myapp.Web - Web UI

したがって、クラスはたとえば次のようになります。

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

等。

作業を進める上で心に留めておきたいのは、「ドメイン」名前空間がアプリケーションの実際のロジックをキャプチャするものだということです。そこで、「ドメインの専門家」(アプリケーションを使用する予定の人物) と話せる内容について説明します。彼らが言及したために何かをコーディングしている場合、それはドメイン名前空間にある必要があります。

このため、複雑すぎるオブジェクト階層を作成することにも注意を払っています。理想的には、ドメイン モデルのやや簡略化された図は、非コーダーが直感的に理解できるようにする必要があります。

この目的のために、私は通常、パターンについて詳細に考えることから始めません。標準的なオブジェクト指向の設計ガイドラインに従って、ドメインをできる限り単純にモデル化するようにしています。オブジェクトである必要があるのは何ですか? それらはどのように関連していますか?

私の考えでは、DDD は複雑なソフトウェアの処理に関するものですが、ソフトウェア自体が最初から非常に複雑でない場合、DDD のやり方が複雑さを取り除くのではなく、複雑さを追加する状況に簡単に陥る可能性があります。

モデルがある程度複雑になると、特定のものをどのように編成する必要があるかが見え始め、どのパターンを使用するか、どのクラスが集約であるかなどがわかります。

私の例では、 Myapp.Domain.Sales.Order は、インスタンス化されたときに、顧客オブジェクトや注文明細のコレクションなどの他のオブジェクトが含まれる可能性が高く、注文明細にのみアクセスするという意味で、集約ルートになります。 order オブジェクトを介してその特定の注文について。

ただし、物事を単純にするために、他のすべてを含み、他の目的を持たない「マスター」オブジェクトは使用しないため、注文クラス自体にアプリケーションで役立つ値とプロパティが含まれます。

したがって、次のようなものを参照します。

Myapp.Domain.Sales.Order.TotalCost

Myapp.Domain.Sales.Order.OrderDate

Myapp.Domain.Sales.Order.Customer.PreferredInvoiceMethod

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

于 2009-02-09T15:43:38.700 に答える
5

アプリケーションのルート名前空間に独自のアセンブリでドメインを配置するのが好きです。

Acme.Core.dll[ルート名前空間: Acme]

これは、ドメインがアプリケーションの他のすべての部分の範囲内にあるという事実をきちんと表しています。(詳細については、Jeffrey Palermo によるThe Onion Architectureを参照してください)。

次に、ドメイン オブジェクトをデータベースにマップするデータ アセンブリ (通常はNHibernateを使用) があります。このレイヤーは、リポジトリとサービス インターフェイスを実装します。

Acme.Data.dll[ルート名前空間: Acme.Data]

次に、選択した UI パターンの要素を宣言するプレゼンテーション アセンブリを作成します。

Acme.Presentation.dll[ルート名前空間: Acme.Presentation]

最後に、UI プロジェクトがあります (ここでは Web アプリを想定しています)。これは、前のレイヤーの要素の構成が行われる場所です。

Acme.Web[ルート名前空間: Acme.Web]

于 2009-02-11T00:27:11.810 に答える
3

あなたは.Net開発者でもありますが、EricEvansとCiterusによるDDDのcargoアプリのJava実装リファレンスは優れたリソースです。

ドキュメント化されたコードでは、Javaパッケージ内で、DDD編成が制限されたコンテキストに組み込まれ、実際に動作していることがわかります。

さらに、BillyMcCaffertyのSharpArchitectureを検討することもできます。これは、DDDを念頭に置いて構築されたASP.Net MVC、NHibernate /FluentNHibernateの実装です。

確かに、コンテキストを提供するには、フォルダー/名前空間ソリューションを適用する必要があります。しかし、Evansのアプローチを#Archと組み合わせると、順調に進むはずです。

何をしているのか教えてください。私も同じ道を進んでおり、あなたからそう遠くはありません!

ハッピーコーディング、

カートジョンソン

于 2009-03-12T15:03:44.490 に答える
1

ドメインにはおそらく名前があるため、この名前を名前空間として使用する必要があります。

通常、リポジトリの実装とデータ アクセスの詳細は、ドメインの名前空間の下にある Persistance という名前の名前空間に配置します。

アプリケーションは、名前空間として独自の名前を使用します。

于 2009-02-11T00:04:16.013 に答える