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 有两个实现者,我怎么知道以后应该创建什么?聚合根1?聚合根2?接口1?Activator 会在这里轰炸,所以我知道我需要实现 IConstructAggregates 但想知道是否还有其他描述符可以告诉我原始提交 agg 根类型是什么。

4

1 回答 1

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]

于 2011-09-22T11:22:55.950 回答