Какой уровень или служба должны связаться с хранилищем, чтобы получить дополнительные данные, необходимые для проверки сущности домена
Я упростил вопрос здесь, чтобы сузить фокус:
Каковы некоторые рекомендуемые подходы к выполнению проверок на уровне домена для построения сущностей, когда необходимы данные из хранилища?
Например, рассмотрим следующее правило проверки, которое необходимо пройти до создания объекта:
Правило 1: работник, запрашивающий мобильный телефон, должен проработать в компании ABC 6 месяцев или более
Информация, доступная для сущности на уровне домена, которая возникла из пользовательского интерфейса, а затем была передана из службы заказов на уровне приложений, не имеет достаточной информации для применения приведенного выше примера правила. Требуется запрос из репозитория, чтобы вернуть дату найма сотрудника, чтобы вычислить, проработали ли они 6 месяцев и более.
Вопрос
Вопрос заключается в том, какой уровень или служба должны связаться с хранилищем в этот момент, чтобы получить дату найма сотрудника, необходимую для проверки правила 1? Объект Домена не считается действительным, если не выполнено Правило 1 и не пройдут и другие значения данных объекта.
Заранее спасибо.
1 ответ
Должен ли вызов в хранилище для получения OrderValidationData быть в службе приложений или на уровне домена.
Проверка домена является доменом, поэтому она должна быть частью службы в домене.
Вам просто нужно представить себе нечто большее, чем сервис приложений, взаимодействующий с каким-либо доменом, где данные, обрабатываемые доменом, не требуют проверки в самом домене. Это очень опасно, потому что если некоторые из служб приложений не выполняют так называемую проверку, домен может сломаться!
Если он находится на уровне домена, то, я думаю, мне придется добавить экземпляр репозитория, необходимый для выполнения вызовов для OrderValidationData? Кроме того, поскольку я читал, что люди не добавляют операции с репозиторием в сущность, мне придется создать доменную службу для выполнения действий с репозиторием.
Модель богатых доменов и модель анемичных доменов (см. Модель богатых и модель анемичных доменов)
А как насчет проверки вашего домена в вашем хранилище? Если вы уже реализовали ProductRepository
Я считаю, что лучше всего проверять доменные объекты, когда они будут добавлены или обновлены. То есть все верхние уровни должны в обязательном порядке следовать правилам хранилища, а это означает, что вы снизили до нуля шансы взломать модель вашего домена.
Кстати, я бы реализовал эти проверки в качестве спецификаций (см. Шаблон спецификации), чтобы вы могли проверить свой домен на ранней стадии какой-либо операции, прежде чем объект домена будет сохранен в хранилище. Может случиться так, что вам потребуется проверить один и тот же объект домена в рамках одной и той же операции, а спецификации являются хорошим другом для повторного использования правил проверки в n-уровневой архитектуре.