Выборка интерфейса CommonDomain / EventStore - PullRequest
1 голос
/ 21 сентября 2011

Я бы хотел получить доступ к своему агрегатному корню через интерфейс, который он реализует:

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

Что мне нужно сказать CommonDomain или EventStore для достижения этой цели? Я считаю, что мой IConstructAggregates получает Реализация Тип агрегата, в котором хранятся события. Нужно ли мне просто хранить свою собственную карту идентификаторов.

Например, скажем, у меня есть следующие корни:

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

Я уже сохранил экземпляр aggregate1, имеющий 'idFromAggRoot1'. Теперь я хочу получить вот так:

repository.GetById<IInterface1>(idFromAggRoot1);

Как я могу узнать, что я должен создать позже, так как есть два разработчика IInterface1? AggRoot1? AggRoot2? IInterface1? Активатор будет бомбить здесь, так что я знаю, что мне нужно реализовать IConstructAggregates, но задаюсь вопросом, есть ли какой-то другой дескриптор, чтобы сказать мне, какой был исходный тип корневого коммита фиксации.

1 Ответ

2 голосов
/ 22 сентября 2011

Метод 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]

...