Я искал довольно долгое время для хорошего решения проблем, представленных типичным шаблоном репозитория (растущий список методов для специализированных запросов и т.д. см.: http://ayende.com/blog/3955/repository-is-the-new-singleton).
Мне очень нравится идея использования командных запросов, особенно с использованием шаблона Specification. Однако моя проблема со спецификацией заключается в том, что она касается только критериев простого выбора (в основном, предложения where) и не затрагивает другие вопросы запросов, такие как объединение, группировка, выбор подмножества или проецирование и т.д. в основном, все дополнительные обручи, которые необходимо выполнить многим запросам, должны пройти, чтобы получить правильный набор данных.
(примечание: я использую термин "команда", как в шаблоне Command, также известный как объекты запроса. Я не говорю о команде, как в разделении команд/запросов, где есть различие между запросами и командами (обновление, удалить, вставить))
Итак, я ищу альтернативы, которые инкапсулируют весь запрос, но все же достаточно гибкие, чтобы вы не просто заменяли репозитории спагетти для взрыва классов команд.
Я использовал, например Linqspecs, и, хотя я нахожу определенную ценность в том, что могу назначать значимые имена для критериев выбора, этого просто недостаточно. Возможно, я ищу смешанное решение, которое сочетает в себе несколько подходов.
Я ищу решения, которые другие, возможно, разработали для решения этой проблемы или решения другой проблемы, но все еще удовлетворяют этим требованиям. В связанной статье Айенде предлагает напрямую использовать контекст nHibernate, но я чувствую, что это в значительной степени усложняет ваш бизнес-уровень, поскольку теперь он также должен содержать информацию о запросах.
Я буду предлагать щедрость на этом, как только истечет период ожидания. Поэтому, пожалуйста, сделайте свои решения щедростью достойными, с хорошими пояснениями, и я выберу наилучшее решение, и повышу бегунов.
ПРИМЕЧАНИЕ. Я ищу что-то, основанное на ORM. Не обязательно должен быть EF или nHibernate явно, но они являются наиболее распространенными и будут соответствовать лучшим. Если он может быть легко адаптирован к другим ORM, это будет бонус. Совместимость с Linq также будет приятной.
ОБНОВЛЕНИЕ: Я действительно удивлен, что здесь не так много хороших предложений. Кажется, что люди либо полностью CQRS, либо полностью находятся в лагере репозитория. Большинство моих приложений недостаточно сложны, чтобы гарантировать CQRS (что-то, что большинство сторонников CQRS с готовностью говорят, что вы не должны использовать его).
ОБНОВЛЕНИЕ: Кажется, здесь немного путаницы. Я не ищу новую технологию доступа к данным, а достаточно хорошо разработанный интерфейс между бизнесом и данными.
В идеале, то, что я ищу, - это какой-то крест между объектами запроса, шаблоном спецификации и репозиторием. Как я уже говорил выше, шаблон спецификации имеет дело только с аспектом предложения where, а не с другими аспектами запроса, такими как объединения, подвыборки и т.д. Репозитории имеют дело со всем запросом, но через некоторое время выходят из-под контроля, Объекты запроса также обрабатывают весь запрос, но я не хочу просто заменять репозитории на взрывы объектов запроса.