1

したがって、私の質問はこれに非常に関連しています:リポジトリとエンティティフレームワークを使用したドメインイベント内のエンティティの永続性?

編集:このトピックに関するより良い議論もここにあります:永続性に依存するドメイン イベントを発生させる場所 - サービス、リポジトリ、または UI?

ただし、正しいアプローチを取っていると仮定すると、私の質問はかなり単純で技術的です。

次のプロジェクトがあるとします。

MyDomainLayer -> very simple classes, Persitence Ignorance, a.k.a POCOs
MyInfrastructureLayer -> includes code for repositories, Entity Framework
MyApplicationLayer -> includes ASP.Net MVC controllers 
MyServicesLayer -> WCF-related code 
MyWebApplication -> ASP.Net MVC (Views, Scripts, etc)

イベントが発生した場合 (たとえば、グループ メンバーシップが付与された場合)、次の 2 つのことを (2 つの異なるレイヤーで) 行う必要があります。

  1. データを永続化する (DB に新しいグループ メンバーシップ レコードを挿入する)
  2. 関連するユーザーへの通知を作成するには (UI 関連)

冒頭で書いた最後のリファレンスの簡単な例を取り上げます。

ドメイン層には次のコードがあります。

public void ChangeStatus(OrderStatus status)
{
    // change status
    this.Status = status;
    DomainEvent.Raise(new OrderStatusChanged { OrderId = Id, Status = status });
}

ベント ハンドラーが MyApplicationLayer にあると仮定しましょう (サービス レイヤーと通信できるようにするため)。次のコードがあります。

DomainEvent.Register<OrderStatusChanged>(x => orderStatusChanged = x);

ワイヤーインはどのように行われますか? 私は構造マップを使っていると思いますが、このワイヤーインコードはどのように正確に見えますか?

4

2 に答える 2

4

まず、レイヤリングが正確ではありません。訂正:

アプリケーション層 - ASP.NET MVC コントローラーは、通常、アプリケーション層と HTTP/HTML の間のアダプターを形成すると考えられています。したがって、コントローラー自体はアプリケーション層の一部ではありません。アプリケーション層に属するのはアプリケーション サービスです。

MyServicesLayer - WCF 関連のコード。WCF で実装されたサービスは、Dennis Traub によって参照されている六角形アーキテクチャのアダプターです。

MyWebApplication - ASP.Net MVC (ビュー、スクリプトなど)。繰り返しますが、これは六角形アーキテクチャのアダプターを形成します。MVC コントローラーもここに属します。事実上、これらはこのアダプターの実装の詳細です。このレイヤーは、WCF で実装されたサービス レイヤーと非常によく似ています。

次に、イベントに応じて発生する 2 つのことを説明します。通常、持続性は、イベントに応答するハンドラーとしてではなく、トランザクション内で作業単位をコミットすることで達成されます。また、永続化が完了した後、つまりトランザクションがコミットされた後に通知を行う必要があります。これは、最初にドメイン イベントを生成した作業単位の外部で、最終的に一貫性のある方法で行うのが最適です。

ドメイン イベント pub/sub システムの実装方法の詳細については、こちらをご覧ください。

于 2012-11-13T00:32:23.150 に答える
3

私の最初の推奨事項は、レイヤーの概念を取り除き、 Hexagonal Architecture aka Ports and Adaptersの概念に慣れることです。

このアプローチを使用すると、ドメイン モデルが周囲の懸念事項から独立した状態を維持する方法を理解するのがはるかに簡単になります。基本的に、それはアーキテクチャ レベルでのオブジェクト指向です。レイヤーは手続き型です。

特定の問題については、イベントをデータベースに投影するイベント ハンドラーを含むプロジェクトを作成できます。これらのハンドラーは、データベースに直接アクセスしたり、ORM を経由したりできます。イベントには必要なすべての情報が含まれているはずなので、おそらくそこにリポジトリは必要ありません。

于 2012-11-12T09:10:36.313 に答える