Моя компания переписывает наше веб-приложение с нуля. Это крупное приложение уровня предприятия со сложной областью в финансовой индустрии.
Мы используем ORM (Entity Framework) для сохранения.
По сути, половина наших приложений сосредоточена на сборе необработанных данных от пользователя, их хранении, а затем другая половина приложения, содержащая большую часть нашей реальной доменной логики, использует эти необработанные данные для создания нашего изображения домена, которое значительно отличается от исходных необработанные данные и передает их в механизм калькуляции, запускает вычисления и выдает результаты, которые затем отображаются для пользователя.
В подходе DDD с использованием уровней кажется, что операции CRUD проходят через уровень домена. но, по крайней мере, в нашем случае это не имеет смысла.
Когда пользователь переходит к экрану редактирования, например, для изменения инвестиционного счета, поля на экране - это точные поля, хранящиеся в базе данных, а не представление домена, используемое позже для расчетов. Так зачем мне загружать представление домена инвестиционного счета, когда экрану редактирования нужно представление базы данных (необработанные данные)?
После того, как пользователь нажимает «Готово» на экране инвестиционного счета, и для контроллера выполняется POST, у контроллера теперь есть точное представление базы данных инвестиционного счета, которое необходимо сохранить. Но по какой-то причине я должен загрузить представление домена для внесения изменений, а не просто отображать модель контроллера непосредственно в модель базы данных (модель платформы Entity)?
Итак, по сути, я сопоставляю модель данных с моделью предметной области, просто чтобы потом ее можно было сопоставить с моделью данных для сохранения. Как это имеет смысл?
Краткий ответ: это не так .
Более длинный ответ: тяжелые шаблоны для разработки модели предметной области не применяются к тем частям вашего решения, которые являются просто базой данных.
Уди Дахан имел интересное наблюдение, которое может помочь прояснить это
В конце концов, цель модели предметной области состоит в том, чтобы гарантировать, что все обновления данных поддерживают текущий бизнес-инвариант. Или, другими словами, модель домена отвечает за обеспечение правильности базы данных, которая действует как система записи .
Когда вы имеете дело с системой CRUD, вы обычно не являетесь системой записи данных. Реальный мир книга записи, и база данных только локально кэшировать представление о реальном мире.
Например, большая часть информации, которая появляется в профиле пользователя, например адрес электронной почты или выданный правительством идентификационный номер, имеет источник правды, который живет за пределами вашего бизнеса - это чужой почтовый администратор, который назначает и отзывает адреса электронной почты, а не ваше приложение. Правительство назначает SSN, а не ваше приложение.
Таким образом, вы обычно не будете выполнять какую-либо проверку домена для данных, поступающих к вам из внешнего мира; у вас могут быть проверки, чтобы гарантировать, что данные правильно сформированы и должным образом очищены ; но это не ваши данные - ваша модель предметной области не получает вето.
Это верно для случая, когда база данных является книгой рекордов .
Уарзи выразился так .
Мы используем модель домена для управления данными, которые принадлежат домену; данные из-за пределов домена уже обрабатываются где-то еще - мы просто кешируем копию.
Грег Янг использует складские системы в качестве основной иллюстрации решений, в которых книга рекордов находится где-то еще (т. Е. На складе). Реализация, которую он описывает, во многом похожа на вашу: одна логическая база данных для сбора сообщений, полученных из хранилища, а затем отдельная логическая база данных, кеширующая выводы, сделанные на основе анализа этих сообщений.
Может быть. Я не хотел бы помечать это как ограниченный контекст, потому что не ясно, какой другой багаж идет вместе с ним. Возможно, у вас два контекста, это может быть один контекст с тонкими различиями в вездесущем языке, который вы еще не выбрали.
Возможный лакмусовый тест: сколько экспертов по доменам вам нужно, чтобы два специалиста по доменам покрывали этот спектр, или только один, который по-разному говорит о компонентах. По сути, вы можете догадаться, сколько у вас ограниченных контекстов, работая по закону Конвея в обратном направлении.
Если вы считаете, что ограниченные контексты согласованы со службами, может быть проще: сможете ли вы развернуть эти две части функциональности независимо? Да предлагает два ограниченных контекста; но если они должны быть синхронизированы, то, возможно, только один.
источник
В вашем домене вы не должны знать, что база данных вообще существует.
Ваш домен о бизнес-правилах. Материал, который должен выжить, когда компания, которая создала вашу базу данных, обанкротится. То есть, если вы хотите, чтобы ваша компания выжила. Очень приятно, когда этим правилам все равно, что вы изменили способ хранения данных.
Детали базы данных существуют и должны быть обработаны. Они должны жить где-то еще. Поместите их через границу. Тщательно контролируйте, как вы общаетесь через эту границу или это не граница.
У дяди Боба есть, что сказать о том, куда поместить ваши данные:
Он также объясняет, как ваши внешние слои должны быть плагинами для ваших внутренних слоев, чтобы внутренние слои даже не знали, что внешние слои существуют.
Следуйте чему-то подобному, и у вас будет отличное место для игнорирования базы данных, где вы можете беспокоиться о правилах проверки ввода, правилах, которые ввод должен каким-то образом сохраняться, правилах для выполнения вычислений, правилах для отправки этих результатов на любой вывод. На самом деле легче читать этот вид кода.
Либо так, либо вы решаете, что ваш домен на самом деле просто манипулирует базой данных. В этом случае языком вашего домена является SQL. Если это так хорошо, но не ожидайте, что ваша реализация бизнес-правил переживет изменения в постоянстве. В конечном итоге вам придется полностью переписать их.
источник
Применение теории DDD:
В этом домене есть два ограниченных контекста:
Каждый ограниченный контекст может иметь различный архитектурный дизайн.
Пример:
Клиентский инвестиционный счет является сущностью (может быть совокупной, зависит от домена), и сохранение данных осуществляется через репозиторий сущности (RDB или другой тип БД, например, база данных ОО).
Не существует DDD-подхода к операциям CRUD. Привязка поля БД к данным объекта нарушает принципы проектирования.
источник