1

特定の状況で新しいドメインエンティティを追加することに関して、UdiDahanによって示されているドメインイベントパターンを理解しようとしています。

通常、エンティティを使用してそれらを作成し、リポジトリを介して追加します。私はまだこれを行うと思いますか?

私の例は、通常、システムにアセットを追加することです。このような:

 var asset= new Asset();
/*bunch of prop setting*/
 _assetRepository.Add(asset);

ただし、アセットの作成は、結果として特定のプロセスを実行したいイベントです。したがって、ドメインイベントで処理できるため、これを行う必要がなくなったことが開発者から提案されました。

var asset= new Asset();
   /*bunch of prop setting*/
asset.Create(location);

これで、createメソッドはイベントを発生させ、create eventハンドラーによって処理されます。このハンドラーは、基本的にイベントをリポジトリに挿入し、作成場所のウェアハウスマネージャーなどに電子メールを送信します。

ただし、アセットにcreateイベントがあることは、私にはかなりアクティブなレコードのように見えます。ただし、ドメインでは、新しいアセットが作成されることについて人々が話します。ですから、よくわかりませんでした。

考え?

4

2 に答える 2

2

作成されたドメインイベントAssetは、その特定のエンティティが作成されるときにクラスのコンストラクターで発生する必要があります。現在の実装では、Assetエンティティがパラメーターなしのコンストラクターを提供しているため、これは誤りです。代わりに、必要なすべてのプロパティをパラメーターとして持つコンストラクターを作成して、一貫性のない状態でのAssetエンティティの作成を防ぎます。次のようになります。

public class Asset
{
  public Asset(string prop1, decimal prop2) 
  {
    this.Prop1 = prop1;
    this.Prop2 = prop2;
    DomainEvents.Raise(new AssetCreated(prop1, prop2));
  }

  public string Id { get; private set; }
  public string Prop1 { get; private set; }
  public decimal Prop2 { get; private set; }
}

作成後も、リポジトリを使用してエンティティを永続化する必要があります。AssetCreated通知時にIDがまだ割り当てられていないため、のハンドラーはIDを参照できないため、これは問題になる可能性があります。イベントソーシングを使用する場合、作成イベントは基になるイベントストアに明示的に保存されます。

于 2012-08-28T02:11:36.337 に答える
2

私はかなり長い間この問題に苦しんでいます。しかし、良い解決策はありません。おもう、

  • ドメインイベントは、それが属するアグリゲートが正常に永続化される前に公開または処理しないでください。
  • ドメインイベントを公開するのはアプリケーション層の責任ではありません

これまでのところ、最善のアプローチはAOPを利用することだと思います。集約でイベントを「発生」させることはできますが、イベントを即座にディスパッチする代わりに、キューに保持し、対応するトランザクションが成功した後に実際にディスパッチします。
これを実現するためにカスタムの@Transactionalインターセプターを定義して、アプリサービスが「イベント公開」の概念を認識しないようにすることができます。

于 2013-08-08T05:49:14.683 に答える