IQueryable & Repositories - взять 2?

Я должен признать, что у меня был баннер "Репозиторий не должен возвращать IQueryable", потому что его сложнее тестировать. Я был под влиянием ответов на другие вопросы, такие как этот и этот.

Этим утром я читал блог ScuttGu о ASP.NET vNext, где он подробно описывает привязку модели с использованием SelectMethod, который, кажется, полагается на IQueryable для подкачки и сортировки.

Как вы думаете, это заставит нас пересмотреть роль, которую IQueryable играет в репозиториях?

1 ответ

Решение

DDD Repository должен инкапсулировать технические аспекты доступа к данным:

Определение: Репозиторий - это механизм для инкапсуляции поведения хранения, поиска и поиска, который эмулирует коллекцию объектов.

Он также отвечает за обработку объектов домена среднего и конца срока службы. Интерфейс репозитория принадлежит Домену и должен быть максимально основан на Вездесущем Языке. В дополнение к книге DDD, эти две статьи охватывают практически все, что вам нужно знать при разработке репозиториев:

На мой взгляд, использование IQueryable в интерфейсе репозитория не является оптимальным. IQueryable не является частью вездесущего языка. Это техническая составляющая, она не имеет никакого предметного значения. Вместо того, чтобы инкапсулировать извлечение данных, в репозитории был бы открыт доступ к механизму доступа к данным, который, в сущности, не оправдывает цель иметь в первую очередь репозиторий.

Что касается ASP.NET. Это структура пользовательского интерфейса. Почему вы позволяете структуре пользовательского интерфейса влиять на дизайн вашей доменной модели? Примеры Microsoft часто поощряют такие вещи, как сетка данных пользовательского интерфейса, привязанная непосредственно к таблицам вашей базы данных. Или, совсем недавно, элементы управления, связанные с так называемой моделью предметной области, в то время как на самом деле это анемичная модель, или просто тупой контейнер данных с get /sets. Цитата из статьи, которую вы упоминаете (я выделил немного):

Привязка модели - это ориентированный на код подход к привязке данных. Это позволяет вам писать вспомогательные методы CRUD в файле code-behind вашей страницы, а затем легко подключать их к любым серверным элементам управления на странице. Затем серверные элементы управления позаботятся о вызове методов в соответствующее время жизненного цикла страницы и привязывают данные.

Моя интерпретация этого состоит в том, чтобы отбросить модель и объекты и просто связать ваши данные с пользовательским интерфейсом. Это, вероятно, правильный и оправданный подход во многих случаях. Но так как вопрос был помечен как DDD, я бы сказал, что в DDD это называется Smart UI Anti-Pattern.

Другие вопросы по тегам