Где хранить константы в DDD / Многоуровневая архитектура - PullRequest
1 голос
/ 22 января 2020
Например,

, у меня есть объект Media, и у него есть объект значения MediaType, который отвечает за хранение / создание типа носителя. Как лучше всего хранить список возможных констант типа мультимедиа? Первое, о чем я могу думать, это хранить внутри MediaType, так как он отвечает за создание шрифтов. Но что, если мне нужно это на прикладном уровне, или на уровне интерфейса для проверки запроса, или даже в запросе.

Похоже, что если я хочу изолировать домен, я не могу хранить константы в MediaType, так как не могу использовать его вне домена. Или использовать константу только в доменном слое и жестко закодировать ее везде, мне кажется неправильным, так как в таком случае у нас нет единого места для ее изменения. Третий вариант - создать отдельный класс констант, такой как MediaConstants, и хранить его вне домена (не знаю, где), но в таком случае похоже, что нам вообще не нужен MediaType VO.

Каковы лучшие практики работы с константами в DDD?

1 Ответ

1 голос
/ 22 января 2020

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

Иногда «внешний» мир может потребовать дублирование , чтобы сделать вещи проще и удобнее. Например, тот факт, что ваш домен проверяет, что адрес электронной почты имеет правильный формат, не означает, что ваш веб-интерфейс не также выполняет эту проверку. Вы могли бы до go такой проверки электронной почты на внешнем интерфейсе, но это в конечном итоге приведет к тому, что у пользователей будет довольно плохое впечатление. Для удобства мы «продублируем» проверку на внешнем интерфейсе.

То же самое касается некоторых данных. Общий подход c для плоских классификационных структур может выглядеть примерно так: ReferenceType 1- * ReferenceItem, где ReferenceType.Name - это что-то вроде MediaType, а ReferenceItem.Name - любые нужные вам значения. Иногда у вас могут быть Code и IsSystemType для ваших ссылочных позиций, но это общая идея. Каждый ссылочный тип будет иметь один или несколько ссылочных элементов, поэтому довольно простое отношение один-ко-многим может быть легко сохранено в некотором хранилище данных. Затем вы можете представить значения своему внешнему интерфейсу с помощью механизма запросов, а в слое интеграции / проблеме (веб-контроллере / обработчике сообщений) вы можете взять имя соответствующего элемента (или код) и сопоставить его, скажем, с вашим перечислением.

...