DDD Обязанности Контроллера по применению MVC
Я рефакторинг приложения для DDD, и пока все хорошо, но у меня возникло сомнение относительно ответственности и каковы наилучшие подходы для ее решения.
Приложение представляет собой веб-приложение, которое используют агенты центра обработки вызовов, с функциями CRM, а бэкэнд представляет собой REST API.
Вариант использования следующий: агент звонит клиенту и ему необходимо собрать некоторую информацию / предложить рекламные акции и т. Д. После того, как он позвонил клиенту и поговорил с ним, ему необходимо заполнить некоторую информацию для этой попытки контакта, часть этой информации является комбинированной. поле с данными, заполненными из базы данных, и оно отправляет запрос POST с идентификаторами объектов в конечную точку для его регистрации.
Таким образом, у нас есть конечная точка contactAttempt, которая получает данные, customerId, agentId, некоторую информацию о поле со списком (subjectId, reasonId, extraInfo1, extraInfo2), дополнительная информация не вызывает этого, а просто упрощает.
Эта информация десериализуется в объект DTO, который передается службе приложений, которая обращается к соответствующему хранилищу, чтобы проверить, действительны ли идентификаторы, и возвращает сущности. Если сущности не найдены, она выдает исключение, которое контролирует ловушка и отвечает клиент с сообщением.
Если все объекты действительны, существуют некоторые доменные правила, например, если это первый контакт с клиентом, отправка приветственного письма и прочее.
Я сомневаюсь, что с этими шагами по извлечению сущностей из репозитория, это должно быть так, или я должен получить его в контроллере, и если все, что мне нужно, присутствует, то я перехожу к службе домена только с логикой, необходимой для применения бизнес-правила?
- Каковы плюсы и минусы упомянутых подходов?
- Есть ли другие подходы?
- Какова ответственность Контролера в контексте MVC?
1 ответ
MVC отвечает за десериализацию HTTP-запроса в сообщении для "прикладного уровня".
Таким образом, он должен получить из строки запроса / тела / заголовков все необходимые значения и передать службе в качестве неизменяемых значений (команда). Это связано с тем, что служба приложения (обработчик, что угодно) должна выполнять команду транзакционно, и если к объектам (таким образом, к поведению) обращаются за пределами уровня приложения, вы не можете быть уверены, что никаких изменений не произойдет за пределами уровня приложения.