1

大規模なプロジェクトの一部である MVC データ メンテナンス アプリケーションを作成しています。ドメイン駆動設計の DDD を使用しようとしています。SO には、これに関する他の質問が既にあります。たとえば、herehere、およびhereです。しかし、彼らは私の質問に完全には答えていません。

データベースには 755 個のテーブルがあるため、データ層にも境界付けられたコンテキストがあります。そのため、ビジネス、役割、製品、顧客などの境界付けられたコンテキストを作成しました。

私たちが抱えている問題は、MVC アプリケーションには、最終的に複数の境界付けられたコンテキストにまたがる ViewModel を使用する「初期設定」のビューがあることです ( Entity Framework 6 の IUnitOfWork パターンを使用)。したがって、そのビューはビジネス コンテキストとロール コンテキストに書き込む必要があります。

ドメイン モデルには、1つBusinessのモデルAddressと 1 つのモデルと、より大きな pobject グラフ内の他のいくつかのモデルがあります。

ViewModelは、これら 2 つのドメイン モデルとその他のドメイン モデルをフラット化して単純化したモデルです。

public class InitialSetupViewModel
{
    string BusinessName{get;set;}
    string Street{get;set;}
    string Street2{get;set;}
    string State{get;set;}
    string ZIP{get;set;}
    ...
}

この ViewModel は、 Automapperで行っているドメイン モデルにマップする必要があります。

コントローラーにドメイン サービスが注入されます。

public class SetupController : Controller
{
    private readonly IMaintenanceService service;

    public SetupController( IMaintenanceService maintenanceService = null )
     {
        service = maintenanceService;
    }

    public void Create(...????....)
    {
        service.CreateBusiness(..?.);
    }

}

問題:

  1. サービスはについて知ることができないInitialSetupViewModelので、何をサービスに渡す必要がありますか?

  2. BusinessDbContextサービスはおよびについて認識している必要がありRolesDbContextます。そのため、両方で SaveChanges() を呼び出す必要があります。これは、単一の IUnitOfWork を持つという目的に反します。ビジネス エンティティとロール エンティティの両方を含む別の UnitOfWork を作成する必要がありますか?

この MVC ビューを機能させるためだけに、これら 2 つの IUnitOfWorks を 1 つに結合することは正当化できないと思います。しかし、解決策は何ですか?

ありがとうございました!

4

1 に答える 1

1

知らないドメインについて強い意見を持つのは常に難しいことですが、次のようになります。

  1. すでにコメントされているように、Controllerビュー モデルとドメイン モデル、DTO、または何を持っているかの間のマッピングの責任を負う必要があります。入力としてのインスタンスを使用できますInitialSetupViewModelが、実装の詳細は異なる場合があります。

  2. ドメインの再構築が正しい選択である可能性があることは事実です。それ以外の場合は、制限されたコンテキストの境界を破る必要があります。ただし、Unit of Work パターンだけに焦点を当てると、あなたの躊躇はよくわかりません。

    1 つのトランザクション内で同期する必要があるすべてのドメイン オブジェクトを追跡するのは、Unit of Work 実装の役割です。同じドメイン オブジェクトが複数の異なる作業単位に関与していても、何ら不思議なことはありません。これは、別のタイプの集合体を扱っているときに、「より小さな」作業単位の実装を「より大きな」ものに結合する必要があるという意味ではありませんが、「役割」と「ビジネス」の両方を 1 つの作業単位に含める必要があります。

    これを行うことは、ビューがどのように見えるかではなく、ドメイン モデルの「真」に惹かれるべきであり、ドメイン オブジェクトのコレクションだけを扱うのではなく、ドメインはおそらく適切な集約を記述する必要があります

おそらく、各ドメイン オブジェクトを個別のトランザクション (作業単位) で保存しても問題ないでしょう。つまり、それらを同期する必要がない場合です。たとえば、永続化に失敗しても (または永続化を望んでさえ) 処理がBusiness停止しない場合でも問題ありませんRoles。逆。実際、境界付けられたコンテキストが実際に正しく定義されている場合、これは事実であると主張することさえできると思います。

これらのコメントがお役に立てば幸いです。

ユニットオブワークアグリゲートに関するマーティン・ファウラー。

于 2014-12-05T13:08:36.177 に答える