Я экспериментирую с DDD + CQRS, и я не могу понять, как справиться с проблемами дублирования этой области:
Во-первых, о дублировании между доменами:
Сценарий 1: Скажем, у меня есть приложение, которое обрабатывает служащих. У меня есть 3 ограниченных контекста: отдел программистов, отдел QA и отдел аудита. У каждого БК есть собственный АР: "Программист", "Тестер", "Рабочий". Они на 99% отличаются друг от друга, с каждой логикой в каждой из них, однако у каждого из них есть "Имя", "Фамилия" и простой метод "getFullName", который объединяет эти два.
Вопрос 1: Как я (и должен ли я?) сделать, чтобы общий метод не дублировался в каждом AR?
Самый простой ответ - это, возможно, сделать некоторый общий "человеческий" класс и сделать из них 3 AR, но это противоречит идее DDD, так как "QA Department" никогда не понадобится "getFullName", но нужно немного другой "общий" метод. Поэтому это решение сделает домен спамом с неиспользуемыми методами.
Теперь о дублировании кода CQRS:
Сценарий 2: База данных содержит счета-фактуры. В каждом счете есть поля "сумма" и "налог". На странице "показать счет" мне нужно указать сумму счета с налогом. Поэтому в моей прочитанной модели мне нужно будет сделать "total = sum + tax", чтобы показать ее конечному пользователю. Тем не менее, пользователь может нажать кнопку "одобрить", которая должна, допустим, зарегистрировать сумму счета в другой базе данных (учет или что-то еще). Итак, в моей модели записи мне снова понадобится сделать "total = sum + tax".
Вопрос 2: Как я (и должен ли я?) удалить этот тип дублирования?
Конечно, это простой сценарий, но, проанализировав некоторые из моих реальных приложений, я вижу, что использование CQRS потребует много большого дублирования в разных местах, так как есть много мест, где конечный результат вычисляется по данным хранится в базе данных, и это делается как для запросов, так и для команд.
Любые идеи? Я что-то пропустил?