Дано:
- У вас есть архитектура с представлениями слоев, бизнесом и данными.
- Вы применяете доменный дизайн.
- Вы используете объектно-реляционный маппер, который позволяет создавать объектно-ориентированные запросы (например, NHibernate, который позволяет создавать HQL-запросы).
Вопрос:
В какой слой следует помещать объектно-ориентированные запросы?
Мои мысли:
Я думаю, что помещать их на уровень представления обычно не имеет смысла. Но я не знаю, поместить ли их в бизнес или на уровень данных.
Пример (NHibernate):
Допустим, вашей бизнес-логике нужен какой-то метод GetCustomersPossblyInterestedIn (продукт p). Затем вы можете создать сложный HQL-запрос, который выбирает объекты клиентов, в которых клиент уже купил продукт той же категории, что и p.
Аргумент а)
С одной стороны, я бы сказал, что этот запрос явно является бизнес-логикой, потому что решение о том, что покупатель относится к товару, возможно, заинтересован в том, купил ли он товар той же категории, является бизнес-решением. Вы также можете выбрать клиентов, которые купили несколько продуктов в одной категории по сходной цене, например,
Аргумент б)
С другой стороны, бизнес-уровень не должен зависеть от уровня данных, поэтому непосредственное использование NHibernate на бизнес-уровне вызывает тревожный звонок.
Возможное решение 1)
Создайте свой собственный объектно-ориентированный язык запросов, который вы используете на бизнес-уровне, и переведите на HQL на уровне данных.
Я думаю, что это вызвало бы много накладных расходов. Если вы используете язык запросов, основанный на объектах запросов, а не на синтаксически проанализированном языке запросов, вы, вероятно, могли бы предпринять некоторые усилия, но мое возражение по-прежнему применимо.
Возможное решение 2)
Непосредственное использование NHibernate на бизнес-уровне - это нормально, потому что уровень абстракции, который NHibernate может предоставить с помощью HQL, ISession и т. Д., Соответствует бизнес-уровню. Нет необходимости его оборачивать.
Что вы думаете?
редактирует:
См. «Репозиторий - это новый Singleton» и «Ложный миф о инкапсуляции доступа к данным в DAL» Айенде Рахиен для тесно связанных обсуждений.