Как использовать библиотеку JS Оливер EventStore?
Я искал Event Sourcing для нового проекта с EventStore J Oliver и mongo в качестве слоя персистентности, но натолкнулся на несколько вопросов:
До попытки получения событий мой домен сохранялся в БД, и я использовал шаблон событий домена Udi, который очень хорошо работал для меня, когда NHibernate управлял единицей работы. Однако я получил одну единицу работы, которая может влиять на несколько агрегатов, например.
Я "извлекаю" свой агрегат корзины покупок, который вызывает событие, на которое обработчик отвечает, создавая агрегат счета, который, в свою очередь, вызывает событие (это только пример)
В этом случае у меня есть одна единица работы, которая изменяет два агрегатных корня - в хранилище событий я могу добавить созданные события к двум разным потокам событий, но они не будут сохраняться атомарным способом (первый может завершиться успешно, а второй - потерпеть неудачу), Так что же делают люди, чтобы избежать этого?
На домашней странице github предлагается, чтобы вы могли использовать свободный интерфейс для настройки EventStore, однако, когда я загружаю исходный код, компилирую его и смотрю на пример, класс wireup кажется недоступным - находится ли он в другой ветке? (У меня есть мастер)
Каков рекомендуемый способ справиться с IStoreEvents? Как синглтон похож на сессионный завод Nhibernates?
1 ответ
На самом деле у вас есть несколько единиц работы в примере, который вы дали. Когда агрегат изменяется, он отправляет событие. Что-то еще слушает это событие и обрабатывает другую единицу работы и так далее.
То, как спроектирован EventStore, может по-прежнему соответствовать вашему сценарию, но это будут три отдельные единицы работы. Вы просто подключили бы решение "Salvation" Udi's DomainEvents к собственной реализации IPublishEvents и запустили его внутри AsynchronousCommitDispatcher. В истинном DDD один агрегат является единицей работы - по определению это граница согласованности.
Около 8 часов назад я сделал пуш, в котором бегло, как часть компиляции. Попробуйте вытащить последнюю из мастера.
IStoreEvents разработан, чтобы быть многопоточным, так что вы можете безопасно настроить его как одноэлементное в вашем приложении. Когда вы открываете сеанс из IStoreEvents, сеанс является однопоточным и не должен совместно использоваться потоками в вашем приложении.