Композиция объектов компонентов NEventStore для DI
Я добавляю NEventStore в свой существующий проект и использую DI.
Я хотел бы иметь экземпляр CommonDomain.Persistence.EventStore.IRepository
введен в мой контроллер MVC. Единственная реализация этого интерфейса EventStoreRepository
,
Этот класс зависит от IConstructAggregates
и единственная реализация, которую я нахожу, AggregateFactory
который помечен как внутренний, находится в тестовом проекте и имеет очень странное имя файла.
Я не должен использовать IRepository
? (почему он помечен как общедоступный и не используется внутренним кодом?)
Я ищу пример проекта здесь и IRepository
используется для манипулирования агрегатами.
Или я должен реализовать IConstructAggregates
себя?
1 ответ
Я борюсь с тем же, я думаю, что короткий ответ:
Если вы не используете снимки, реализация в тестовом проекте будет работать нормально. На самом деле, я бы добавил немного кода, чтобы вызвать исключение, если бы вам дали снимок.
Если вы используете моментальные снимки, вам придется использовать подход, аналогичный описанному в конце описанного здесь: http://williamverdolini.github.io/2014/08/20/cqrses-neventstore-snapshots/
По сути, проблема в том, что для объекта, который вы вернете из IConstructAggregates, будет воспроизведен поток событий, начиная с версии, следующей сразу за переданным снимком.
Просто предположение, но я думаю, что причина, по которой это не может быть "официально" реализовано в CommonDomain:
Если у вас есть агрегаты, которые поддерживают моментальные снимки, вы должны реализовать
GetSnapshot()
на них в любом случае, и вы бы хотели построитьIConstructAggregates
реализация, которая может повторно гидратировать эти агрегаты как-то (возможно,ISupportSnapshots
интерфейс?)Вполне возможно, что вы захотите использовать свой DI-контейнер для создания вашего Aggregate, а не просто
Activator.CreateInstance<T>()
,
Похоже, этот фрагмент кода использует ту же логику, что и AggregateFactory
из тестового проекта: - http://pastebin.com/cFESMiTz