約1年前、ASP.Net MVC 3(現在)のプレゼンテーション層、アプリケーション層、ドメイン層、インフラストラクチャ層(横断的なものとデータ)で構成されるソリューションをセットアップしました。現在、フロントエンドは1つしかないため、ドメインモデルをドメインロジックとは別のプロジェクトに保持し、DTOの代わりにドメインエンティティを渡すことで、プレゼンテーション層へのリラックスしたアプローチを使用することにしました。
メインのWebサイトに加えて、まもなく分散レイヤーのサービスを提供する予定であり、そこでDTOを使用しますが、メインのWebサイトでもDTOを使用することを検討しています。また、ドメインレイヤー(IRepository、IUnitOfWork、Entity / Valueオブジェクトのスーパータイプなど)でフレームワークコードをわざわざ分割する必要があるかどうかも疑問に思っています。ここで、フィードバックが必要な質問をリストアップしましょう。
1)貧血のドメインモデルを持たないことにかなり熱心に取り組み、プレゼンテーションの懸念に固有の動作にも注意しました。必要なビジネス計算のほとんどはドメインエンティティで行われます。プレゼンテーション層がこの動作を直接呼び出すことは問題ありませんか、それとも代わりにアプリケーションサービスを呼び出してドメインエンティティを呼び出す必要がありますか?これは、プレゼンテーション層にドメインエンティティについて認識させる理由がなく、代わりにDTOを使用できることを示唆しています。または、DTOにこれらの動作を公開させることもできますが、ドメインエンティティを奪っているような気がします。だから私はそれが最良の3つのオプション(直接呼び出されるリッチドメインオブジェクト、サービスレイヤーまたは動作付きのdto)だと思いますか?
2)現在、ドメインサービス、仕様、ロジックを備え、アプリケーション層とドメインモデル用の個別のプロジェクト(プレゼンテーション層とアプリケーション層で使用)によって調整されたドメインプロジェクトがあります。ここには、ジェネリックリポジトリと作業単位パターンのフレームワークインターフェイスもあります。フレームワークのものを別のプロジェクトに分割し、残りを1つのプロジェクトに結合する必要がありますか?
3)ドメインレイヤーを集約に再編成したいのですが、現在、すべてのドメインモデルはモジュールごとに編成されており、基本的に各モジュールのすべてのタイプが1つの名前空間にあります。エンティティ、値オブジェクト、サービス、その他のものを集計ごとに整理する方がよいでしょうか?
4)基本的に.net Frameworkヘルパーライブラリタイプであるインフラストラクチャサービスに分離インターフェイスパターンを使用する必要がありますか?たとえば、構成オブジェクトまたは検証ランナー?そうすることの利点は何ですか?
5)最後に、私が見た例の多くは、ドメインエンティティのインターフェイスを使用していません。私が持っているほとんどすべてのオブジェクトは、依存関係の理由でインターフェースを渡すことを好み、テストがはるかに簡単になります。コンクリートの代わりにインターフェースを使用することは有効ですか?EF 4.3.1(まもなく最新バージョンにアップグレードする)を使用していることを言及する必要があります。EFにはインターフェイスなどの使用に問題があったことを覚えているようです。ドメインエンティティの代わりにインターフェイスを公開する必要がありますか?
事前にどうもありがとうございました。
プロジェクト構造:
Presentation.Web | | | 応用 | | | Domain.Model-ドメイン (Infrastructure.Data、Infrastructure.Core、Infrastructure.Security)
説明:Presentation.Web(MVC3 Webプロジェクト)
アプリケーション-ドメイン層を調整し、プレゼンテーション層からの要求に応答するサービス層(この更新を取得します)。これはモジュールごとに編成されています。たとえば、顧客モジュールがある場合はApplication.Customerがあり、その中にすべてのアプリケーションサービスがあります。
ドメイン-ドメインエンティティの動作として公開されていないドメインサービス、仕様、計算、およびその他のドメインロジックが含まれます。たとえば、アプリケーション層が呼び出すドメインサービスとして公開されている複数のドメインエンティティを含む計算。-仕様フレームワークのフレームワークコードと、汎用リポジトリおよび作業単位パターンのメインインターフェイスも含まれています。
Domain.Model-ドメインエンティティと列挙が含まれます。モジュールごとに整理されています。たとえば、customerエンティティ、customerorderエンティティなどを含むcustomerモジュールがある場合、これはドメインプロジェクトから切り離され、アプリケーションとプレゼンテーションレイヤーでオブジェクトを使用できるようになります。
Infrastructure.Security-認証と承認のためのセキュリティインフラストラクチャ
Infrastructure.Core-複数のレイヤー(バリデーター、ロギング、構成、拡張機能、IoC、電子メールなど)で使用される分野横断的なもの。ほとんどのプロジェクトは、インフラストラクチャサービスをこのプロジェクトのインターフェイス(domain.modelを除く)に依存しています。
Infrastructure.Data-LINQおよびEF4.3.1を介したリポジトリの実装、マッピングレイヤー、作業単位の実装。インターフェイスはドメインプロジェクトにあります(分離されたインターフェイスパターン)