В этой статье я расскажу о внедрении Event-Sourcing вашего приложения. Этот уровень окружает домен и реализует варианты использования (бизнес-правила для конкретного приложения). Он управляет потоком данных и использует модель предметной области и инфраструктуры и не зависит от базы данных, пользовательского интерфейса или специальных сред.
Вам также может понравиться:
Создание микросервисов на основе событийно-управляемой архитектуры, часть 7
Для нашей системы обработки событий я возьму все незафиксированные события из агрегата и вызову функцию хранилища, которая будет отвечать за сохранение событий в хранилище событий. Поэтому я буду вызывать функцию AppendAsync (EventStore @event) в IEventStoreRepository .
Поскольку я еще не внедрил обновления, я не буду заботиться о агрегатной версии (у меня есть один метод post, который создает речь, поэтому агрегатная версия всегда будет равна нулю).
Когда я буду внедрять обновления, я позабочусь о агрегатной версии на уровне приложений и презентации.
Интерфейсы Event-Sourcing
Я могу определить два интерфейса IEventSourcingSubscriber и IEventSourcingHandler , вы можете использовать другое соглашение об именах, но пока я оставляю их как есть.
Subscribe — это функция, которая получает все незафиксированные события из агрегата и для каждого события вызывает функцию
Handle, которая принимает событие и текущую версию агрегата в качестве входных данных.
Дескриптор — это функция, которая сериализует событие в строку и вызывает AppendAsync (EventStore @event) из IEventStoreRepository.
Внедрение Event-Sourcing
Внедрение подписки на Event-Sourcing
Итак, первый тест должен быть следующим: подписка без незафиксированных событий не должна вызывать дескриптор
У меня нет незафиксированных событий, я ничего не буду делать. Тогда раздел Assert будет выглядеть так:
mockEventSourcingHandler. Verify (m => m. Handle (It.IsAny <Event> (), It.IsAny <long> ()), Times.Never , «Handle не должен вызываться»);
Тестовый пример 1: подписка без незафиксированных событий не должна вызывать дескриптор
Здесь я закончу реализацию своей функции
Тестовый пример 2: подписка с незафиксированными событиями должна обрабатывать вызов только один раз
mockEventSourcingHandler. Verify (m => m. Handle (It.IsAny <Event> (), It.IsAny <long> ()), Times.Once , «Handle должен вызываться только один раз»).
В разделе Assert я могу убедиться, что функция Handle вызывается только один раз.
Окончательная реализация EventSourcingSubscriber должна выглядеть следующим образом:
Я вызываю функцию-обработчик для каждого события.
Реализация обработчика событий
Тестовый пример 3: обработка с нулевыми событиями должна вызывать Eventnullexception
Я высмеиваю некоторые зависимости и проверяю, что если событие нулевое, то дескриптор должен вызвать исключение.
Вот реализация теста.
Контрольный пример 4. Обработка событий должна вызывать AppendAsync
Здесь я проверяю, что если событие не является нулевым, то Handle должен вызвать AppendAsync.
Вот реализация теста. Вы можете заметить, что я использую интерфейс IEventSerializer для сериализации события в строку JSON, эта строка JSON будет полезной нагрузкой потока событий.
Обновление RegisterSpeechUseCase
Затем обновите RegisterSpeechUseCase и вызовите функцию подписки : await _domainEventSubscriber.Subscribe (речь);
Обновить презентацию
Откройте файл Startup.cs и настройте некоторые внедрения зависимостей.
Откройте appsettings.Development.json и обновите ConnectionStrings, чтобы использовать соответствующий сервер базы данных, имя базы данных и учетные данные.
Скрипты для создания базы данных находятся в проекте LogCorner.EduSync.Speech.Database.
Тест с использованием Postaman
Тестирование локального кода с использованием Visual Studio
Выберите проект LogCorner.EduSync.Speech.Presentation и нажмите F5.
Запустите почтальон и запустите следующий HTTP-пост.
Конечная точка : http: // localhost: 62694 / api / speech
Метод : ПОСТ
Тип контента: Приложение / JSON
Тело :
Джава
1
{
2
"Title":"Le Lorem Ipsum est simplement du faux texte",
3
"Description":"Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte",
4
"Url":"http://www.yahoo_1.fr",
5
"Type":"3″
6
}
Откройте SQL Server Management Studio и выполните следующие команды:
SELECT * FROM [LogCorner.EduSync.Speech.Data]. [Dbo]. [Речь]
SELECT * FROM [LogCorner.EduSync.Speech.Data]. [Dbo]. [EventStore]
Результат должен выглядеть так:
В результате у меня должны появиться записи в таблице Speech и таблице EventStore , версия всегда равна нулю, потому что этот учебник не охватывает обновления.
Протестируйте локальный код с помощью Docker
Найдите папку \ LogCorner.EduSync.Command \ src (в которой находится файл docker-compose.yml) и выполните следующую команду.
- Docker-составь сборку.
- Докер-сочиняй.
- Docker ps -all -format «table {{.ID}} \ t {{.Image}} \ t {{.Names}} «.
Запустите почтальон и запустите следующий HTTP-пост.
Конечная точка : http: // localhost: 8080 / api / speech
Метод : ПОСТ
Тип контента : приложение / JSON
Тело :
Джава
xxxxxxxxxx
1
{
2
"Title":"Le Lorem Ipsum est simplement du faux texte",
3
"Description":"Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte",
4
"Url":"http://www.yahoo_1.fr",
5
"Type":"3″
6
}
Наконец, проверьте работающие контейнеры следующим образом:
Откройте оболочку bash, выполнив следующую команду (где 0b — первые буквы идентификатора контейнера logcorner.edusync.speech.presentation.data )
Dockerfile
xxxxxxxxxx
1
Docker exec -it 0b "bash"
2
Connect to sql server linux
3
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'PassW0rd'
5
Run sql queries
6
use [LogCorner.EduSync.Speech.Database]
8
go
9
select * from [dbo].[Speech]
11
go
12
select * from [dbo].[eventstore]
14
go
В результате у меня должны появиться записи в таблице Speech и таблице EventStore , версия всегда равна нулю, потому что этот учебник не охватывает обновления.
Исходный код этой статьи доступен здесь ( Feature / Task / EventSourcingApplication ).
С уважением!
Дальнейшее чтение
Прочитайте остальную часть ряда!
Часть 1: бизнес-правила для конкретных приложений
Часть 2. Доменные объекты и бизнес-правила