1

実装するインターフェースを使用して集約ルートにアクセスしたいのですが、次のようになります。

 repository.GetById[[IMyInterface]](id);    

これを実現するには、CommonDomainまたはEventStoreに何を伝える必要がありますか?IConstructAggregatesは、イベントを格納したアグリゲートの実装タイプを受け取ると思います。自分のIDマップを保持する必要がありますか?

たとえば、私がこれらのaggのルーツを持っているとしましょう:

class AggRoot1 : IInterface1, IInterface2 {}
class AggRoot2 : IInterface1, IInterface2 {}

'idFromAggRoot1'を持つaggregate1インスタンスをすでに保存しました。今、私はそのようにフェッチしたい:

repository.GetById<IInterface1>(idFromAggRoot1);

IInterface1には2つの実装者がいるので、後で何を作成する必要があるかをどのように知ることができますか?AggRoot1?AggRoot2?IInterface1?アクティベーターはここで爆撃するので、IConstructAggregatesを実装する必要があることはわかっていますが、元のcommitaggrootタイプを教えてくれる他の記述子があるかどうか疑問に思います。

4

1 に答える 1

2

このIConstructAggregates.Build()メソッドは、必要なタイプを返すように実装できます。

デフォルトの実装ではCommon.AggregateFactory、を介してAggregateのインスタンスを作成しますActivator.CreateInstance(type) as IAggregate

独自の実装は次のようになります。

public class MyAggregateFactory : IConstructAggregates
{
    public IAggregate Build(Type type, Guid id, IMemento snapshot)
    {
        if (type == typeof(IMyInterface))
            return new MyAggregate();
        else
            return Activator.CreateInstance(type) as IAggregate;
    }
}

編集:集計タイプは、イベントメッセージのヘッダーに次のように保存されますEventMessage.Header[EventStoreRepository.AggregateTypeHeader]

于 2011-09-22T11:22:55.950 に答える