Насколько я понимаю, главное - это отделить доменную логику (бизнес-логику) от инфраструктуры (БД, файловая система и т. Д.).
Это основа недоразумения: цель DDD не состоит в том, чтобы разделить вещи по жесткой линии, например, «это на сервере SQL, поэтому не должно быть BL», цель DDD - разделить домены и создать барьеры между они позволяют внутренним элементам домена быть полностью отделенными от внутренних элементов другого домена и определять общие внешние элементы между ними.
Не думайте, что «быть в SQL» - это барьер BL / DL - это не то, что есть. Вместо этого думайте, что «это конец внутреннего домена», как барьер.
Каждый домен должен иметь внешние API-интерфейсы, позволяющие ему работать со всеми другими доменами: в случае уровня хранения данных он должен иметь действия чтения / записи (CRUD) для объектов данных, которые он хранит. Это означает , что само по себе SQL не является на самом деле барьер, VIEW
и PROCEDURE
компоненты. Вы никогда не должны читать непосредственно из таблицы: это подробности реализации DDD говорит нам, что, как внешний потребитель, мы не должны беспокоиться.
Рассмотрим ваш пример:
Что мне интересно, так это то, что происходит, когда у меня возникают очень сложные запросы, такие как запрос на расчет материальных ресурсов? В таких запросах вы работаете с тяжелыми операциями над множествами, для которых и был разработан SQL.
Это именно то, что должно быть в SQL, и это не является нарушением DDD. Это то, для чего мы сделали DDD . С этим вычислением в SQL это становится частью BL / DL. Что бы вы сделали, это использовали бы отдельное представление / хранимую процедуру / что-что-у-вас и держали бизнес-логику отдельно от уровня данных, так как это ваш внешний API. Фактически, ваш уровень данных должен быть еще одним DDD Domain Layer, где ваш уровень данных имеет свои собственные абстракции для работы с другими уровнями домена.
Выполнение этих вычислений в инфраструктуре также не может произойти, потому что шаблон DDD позволяет вносить изменения в инфраструктуру, не изменяя уровень домена и не зная, что MongoDB не обладает такими же возможностями, как, например, SQL Server, что не может произойти.
Это еще одно недоразумение: в нем говорится, что детали реализации внутри могут меняться без изменения других уровней домена. В нем не сказано, что вы можете просто заменить целую часть инфраструктуры.
Опять же, имейте в виду, что DDD скрывает внутренние компоненты с четко определенными внешними API. Где находятся эти API - это совершенно другой вопрос, и DDD этого не определяет. Он просто определяет, что эти API существуют и никогда не должны изменяться .
DDD не настроен так, чтобы вы могли произвольно заменить MSSQL на MongoDB - это два совершенно разных компонента инфраструктуры.
Вместо этого давайте воспользуемся аналогией для определения DDD: газ против электромобилей. У обоих автомобилей есть два совершенно разных метода создания тяги, но у них одинаковые API: включение / выключение, дроссель / тормоз и колеса для движения автомобиля. DDD говорит, что мы должны иметь возможность заменить двигатель (бензиновый или электрический) в нашем автомобиле. Это не говорит о том, что мы можем заменить автомобиль на мотоцикл, и это фактически то, что MSSQL → MongoDB.