Репозиторий, согласно шаблону репозитория, должен предоставлять запросы или фактические объекты? - PullRequest
3 голосов
/ 12 апреля 2011

В настоящее время я выполняю рефакторинг своего кода для веб-приложения, разработанного с использованием ASP.NET MVC3 с C # и Razor.Одним из шаблонов, которые я использую для улучшения структуры своего приложения, является шаблон Репозиторий , который, помимо того, что он действительно полезен, также часто обсуждается в сообществе разработчиков.

В этом контексте я нашел статью Фредрика Нормена , в которой говорится, что, согласно определению репозитория, класс репозитория должен предоставлять фактические сущности (например, List в .NET), а незапрашиваемые объекты (IQueriable в .NET).Вместо этого в учебнике NerdDinner на официальном веб-сайте ASP.NET MVC они используют IQueriable, когда репозиторий должен предоставить несколько экземпляров одного и того же объекта и фактическую сущность, когда репозиторий должен предоставить один экземпляр объекта.

Какой наиболее правильный подход использовать при моделировании класса / интерфейса репозитория согласно шаблону репозитория?

Спасибо

Франческо

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

По моему мнению подобные вещи вредны для использования вашего времени.; -)

Теоретически, ваш репозиторий должен возвращать объекты или их традиционные коллекции, да.Однако даже в определении шаблона репозитория, на который вы ссылаетесь, используется термин «интерфейс, подобный коллекции».Конечно, IQueryable<Entity> - это интерфейс, похожий на коллекцию, да?

На практике я почти никогда не задумываюсь о различии ... но я всегда стараюсь поместить весь код запроса в хранилище,Я бы сказал, что 90% моих методов репозитория на основе коллекций возвращают традиционные коллекции, а остальные 10% возвращают что-то на основе IQueryable<>.Исключения обычно связаны с подкачкой страниц;так что я могу получить итоговые данные из запроса по строке , если необходимо , и мне не нужно получать эту информацию раньше, если она мне не нужна.Это немного лениво, но это работает для меня.

Но я действительно считаю хорошей идеей всегда пытаться возвращать традиционные коллекции, потому что это будет означать, что вы инкапсулируете все свои запросыв хранилище, где это должно быть.Я бы порекомендовал просто не увлекаться экстремальными уровнями приверженности чьему-то представлению о том, что требуется для pattern-X

1 голос
/ 12 апреля 2011

Мнения по этому вопросу будут разными, как вы уже нашли.Для небольших приложений вполне возможно, что ваши репозитории предоставляют IQueryable.

Одна вещь, которую вы, безусловно, не должны делать, это передавать IQueryable вашим взглядам.Убедитесь, что ваши представления получают только материализованные объекты и коллекции (например, List или массивы).Таким образом, если в запросе где-то существует ошибка, она будет возникать в контроллере (или хранилище), а не в вашем представлении.Это позволяет вам проверять запросы и обрабатывать ошибок изящно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...