Есть ли элегантный способ разместить проверки домена внутри уровня домена?

Я новичок в предметно-ориентированном дизайне, и когда я пишу модель предметной области, меня беспокоит одна вещь. Как справиться с проверкой домена?

Я разрабатываю систему управления библиотекой, где пользователь может искать книги и видеть, есть ли книга в наличии. Если это не так, пользователь может создать запрос на книгу, чтобы создать какую-то очередь. Правило в том, что у нас нет на складе книг. Прямо сейчас у меня есть информация о количестве внутри сущности книги, и это не проблема, но что, если у меня другой ограниченный контекст для запроса книг и каталога книг. Затем я должен каким-то образом связаться с другой вертикалью / службой и спросить (подтвердить), что количество книг равно нулю, прежде чем создавать совокупность книг.

Также я проверяю, есть ли у пользователя действующая членская карта, есть ли у него книга, есть ли у пользователя активные запросы на какую-либо книгу.

То, что меня беспокоит.

Мне нужно знать, что именно включать в совокупность, прежде чем передавать это в модель предметной области из-за проверок. Я не уверен, что это самый безопасный подход, потому что точность моих проверок будет зависеть от спецификации / запроса и т. Д.

Еще одна очень важная вещь. Когда метод прикладного уровня запускается с выполнения, и что-то недопустимое, клиент будет получать только сообщения проверки для кода, который был выполнен, и есть большая вероятность, что есть другие вещи, которые препятствуют выполнению кода. Это может быть очень неудобно, если пользователь заполняет какую-либо форму.

Первые мысли по решению этой проблемы.

У меня есть архитектура команд / обработчиков, и я использую MediatR, поэтому я думаю о переносе проверки домена между командой и обработчиком, и это решит мои проблемы на данный момент, но этот подход будет распространять знания о предметной области в ограниченном контексте, а модель предметной области не будет достаточно умной, чтобы охранять от недействительных действий. Точнее, перед выполнением метода (обработчика) приложения мне нужно будет подумать, что мне нужно проверить.

Так что мне действительно любопытно. Есть ли какой-либо четкий способ обработки проверок домена внутри модели домена?

1 ответ

Решение

Есть ли какой-либо четкий способ обработки проверок домена внутри модели домена?

Да; они требуют работы и тщательного мышления.

Один из аспектов тщательного мышления - отличить проверку сообщения от логики предметной области. Проверка сообщения - это изолированная вещь, сообщение является действительным или нет в соответствии со схемой сообщения - присутствуют ли все обязательные поля, указаны ли данные в правильной форме, указаны ли числа в допустимом диапазоне и т. Д. Действительно, мы задаем вопрос "правильно ли клиент заполнил форму?"

Интеграция действительного сообщения с ранее известной информацией (также известной как "состояние" модели предметной области) является проблемой логики предметной области. Состояние выбрано сознательно - модель предметной области - это конечный автомат для бухгалтерии вашего домена.

В зависимости от вашего домена и доступной информации могут быть состояния, которые означают, что клиент не получает то, что хочет. "Менее пройденная дорога" не означает, что вещи недействительны.

Более того, если ваша система является распределенной (за разные части данных отвечают разные органы), то любые локально кэшированные копии этих данных обязательно устарели и могут быть устаревшими. См. Воспоминания, предположения и извинения Пэта Хелланда. То, что мы иногда даем неверный ответ, является неизбежным следствием распределения работы. Если мы несем ответственность, то мы выполнили анализ рентабельности, чтобы убедиться, что ожидаемые выгоды от распределения работы компенсируют ожидаемые риски.

Другие вопросы по тегам