CommonDomain / EventStore接口提取

时间:2011-09-21 12:52:40

标签: cqrs event-store

我想通过它实现的接口访问我的聚合根:

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

我需要告诉CommonDomain或EventStore完成此任务?我相信我的IConstructAggregates会收到存储事件的聚合的 Implementation 类型。我是否需要保留自己的ID图。

例如,假设我有这些根源:

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

我已经保存了一个具有'idFromAggRoot1'的aggregate1实例。 现在我想这样取:

repository.GetById<IInterface1>(idFromAggRoot1);

由于有两个IInterface1实现者,我怎么知道我后来应该创建什么? AggRoot1? AggRoot2? IInterface1? Activator会在这里炸弹,所以我知道我需要实现IConstructAggregates但是想知道是否还有其他描述符告诉我原始的commit agg root类型是什么。

1 个答案:

答案 0 :(得分:2)

可以实现IConstructAggregates.Build()方法以返回您需要的任何类型。

Common.AggregateFactory中,默认实现通过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]