Недавно я прочитал множество аргументов против использования шаблона репозитория с мощной ORM-подобной Entity Framework, поскольку она включает в себя функциональность, подобную репозиторию, а также функциональность Unit of Work.
Еще один аргумент против использования шаблона для ситуации, такой как модульное тестирование, заключается в том, что шаблон репозитория является утечкой абстракции, поскольку более общие реализации используют IQueryable.
Аргументы против использования шаблона репозитория имеют смысл для меня, но предложенные альтернативные методы абстракций часто более запутанны и кажутся такими же излишними, как и проблема.
Решение Джимми Богардса, похоже, представляет собой смесь издувания абстракций, а также представления его собственной архитектуры. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Еще один пример того, что репозитории были излишни .... но используйте мою архитектуру! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Другой ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Я не нашел четкой замены или альтернативы «чрезмерно сложному» подходу к шаблону репозитория, который сам по себе более не спроектирован.
источник
Ответы:
Я думаю, что вы объединяете репозитории и общие репозитории.
Базовый репозиторий просто связывает ваше хранилище данных и предоставляет методы для возврата данных
Он не пропускает слой данных в ваш код через IQueryable или другие способы передачи случайных запросов и обеспечивает четко определенную тестируемую и инъецируемую поверхность методов.
Универсальный репозиторий позволяет передавать ваш запрос так же, как ORM
Я согласен, что нет смысла использовать универсальный репозиторий поверх ORM, который по сути является просто еще одним универсальным репозиторием.
Ответ заключается в том, чтобы использовать базовый шаблон репозитория, чтобы скрыть свой ORM
источник
Большинство аргументов, которые вы упоминаете, ошибочно приписывают тем возможностям шаблона репозитория, которых у него нет.
Концептуально репозиторий, изначально определенный в DDD, - это просто набор объектов, которые вы можете искать или добавлять. Механизм постоянства, стоящий за ним, абстрагирован, поэтому у потребителя возникает иллюзия, что это коллекция в памяти.
Реализация репозитория, имеющая неплотные абстракции (
IQueryables
например, разоблачающие ), является плохой реализацией репозитория.Реализация репозитория, которая предоставляет больше, чем просто операции сбора (например, функции Unit of Work), является плохой реализацией репозитория.
Существуют ли альтернативы хранилищу для доступа к данным? Да, но они не связаны с вопросами, которые вы затрагиваете в своем вопросе.
источник
Для меня репозитории в сочетании с ORM или другими уровнями персистентности БД имеют следующие недостатки:
Такие как:
4. Объект «Опасность Бога»: у вас может возникнуть соблазн создать один класс Бога, охватывающий всю вашу модель или слой доступа к данным. Класс репозитория будет содержать не только методы Car, но и методы для всех сущностей.
На мой взгляд, лучше предложить хотя бы несколько вариантов запросов, чтобы избежать огромного беспорядка многих одноцелевых методов. Неважно, является ли это LINQ, собственным языком запросов или даже чем-то, взятым непосредственно из ORM (хорошо, проблема связывания ...).
источник
Если целью интерфейса Repository является макетирование базы данных для юнит- теста (= изолированного теста), то лучшая абстракция - это то, что легко смоделировать.
Трудно смоделировать интерфейс репозитория, основанный на результате IQueryable.
С точки зрения юнит-тестирования
может быть легко издеваться
может быть легко смоделировано, только если mock игнорирует содержимое параметра запроса.
не может быть легко издеваться
источник
Я не думаю, что шаблон репозитория является излишним, если вы используете лямбда-функции для запросов. Особенно, когда вам нужно абстрагировать ORM (по моему мнению, вы всегда должны это делать), тогда я не буду заботиться о деталях реализации самого репозитория.
Например:
источник