Кстати, а почему CRUD service - антипаттерн? В какой-нибудь луковице это вполне нормально. Если на него не фронтенд смотрит, а какой-то сервис бинес-логики.
Кстати, а почему CRUD service - антипаттерн? В какой-нибудь луковице это вполне нормально. Если на него не фронтенд смотрит, а какой-то сервис бинес-логики.
Нарушается принцип инкапсуляции, данные в сервисе, а логика домена где-то снаружи. Так сервис не контролирует свое поведение, а является лишь интерфейсом к БД. Бизнес-логика множится по внешним сервисам.
Ну, иногда и правильно, что множится, если сущность включена во много разных процессов. Ну, например, "пользовательская история операций" - вполне себе EntityService...
Сервис истории предоставляет внешним системам лишь чтение ленты операций, а не запись туда всего чего попало в любом порядке. Формирование событий ленты истории это вполне себе логика прикладных систем.
Скажем операция совершается в некоем сервисе, прилетает как рассылка события по системе через Kafka, в том числе и в историю (и в другие системы тоже). При этом внешним системам сервис истории предоставляет только функцию чтения ленты истории.
Ну, получить событие из кафки - это тоже API и тоже в рамках CRUD. Он же не умеет понимать 20 разных форматов этих событий и по каждому укладывать разное в историю, это была бы избыточная зависимость для него.
Ну, получить событие из кафки - это тоже API и тоже в рамках CRUD. Он же не умеет понимать 20 разных форматов этих событий и по каждому укладывать разное в историю, это была бы избыточная зависимость для него.
обрати внимание что сервис истории читает события других сервисов, но функцию записи в историю не предоставляет
Разница есть при соблюдении правила что топики Кафки создаются как каналы рассыхки исходных событий по сервисам системы, а не как труба для наливки данных в конкретного получателя