MVC решение для проектирования шаблонов репозитория - PullRequest
12 голосов
/ 15 марта 2010

У меня есть приложение asp .net MVC, и я недавно начал реализовывать шаблон хранилища со слоем проверки службы, очень похоже на this .

Я создавал один репозиторий / сервис для каждой модели, которую я создаю. Это перебор? Вместо этого я должен создать один репозиторий / сервис для каждой логической бизнес-области, которая предоставляет CRUD для многих различных моделей?

Мне кажется, что я либо загромождаю дерево проекта многими файлами, либо загромождаю класс многими методами. 6 в одну сторону полдюжины другой. Можете ли вы придумать какие-либо хорошие аргументы в любом случае?

Ответы [ 2 ]

16 голосов
/ 15 марта 2010

Как правило, если вы используете «истинный» шаблон репозитория, в отличие от других постоянных уровней (например, ActiveRecord или DAO), вам следует стремиться идентифицировать агрегаты вашего домена и создать один репозиторий на агрегат.

Что это значит? Ну, это во многом зависит от вашего приложения, но обычно есть объекты, которые, естественно, являются «родителями» других объектов или являются частью связанной транзакции.

Я думаю, что каноническим примером является система электронной коммерции, в которой у вас есть концепция заказа, а в заказе есть строки заказа, каждая строка заказа - это какой-то продукт и количество, и так далее.

В этом случае объект Order является одним из агрегатных корней системы, и создается OrderRepository.

В этом случае следует помнить, что существует некоторая связь (подразумеваемая или иная) между ордером и его линиями ордеров и так далее. Поэтому части C-UD «CRUD» в репозитории, как правило, должны представлять собой просто один метод, и, как правило, должны просто брать экземпляр этого совокупного корневого объекта и работать с ним (например, repo.Save (order)). Могут быть и другие возможные параметры, но это зависит от вашего значения.

Фактически, вы часто можете решить большую часть C-UD с наследованием (т.е. создать RepositoryBase, который реализует их, используя некоторую известную логику о том, что должно произойти для вашей конкретной схемы персистентности).

Так что это оставляет нам R-часть CRUD. В этом случае вы можете получить тонну методов запроса (GetById; GetByName; GetByCustomerName и т. Д.), Если решите пойти по пути метода запроса. Некоторые люди предпочитают, особенно для простых приложений, предоставлять интерфейс на основе linq (например, IQueryable GetAll ()), к которому затем могут применяться предложения Where. YMMV в зависимости от вашего основного упорства на этом, но это хороший способ для простых приложений, особенно. если вы ожидаете, что ваш поставщик персистентности будет поддерживать linq напрямую.

Наконец, многие люди на самом деле отделяют часть запроса с помощью одной имплантации или другой из шаблона разделения ответственности командного запроса, в котором говорится, что интерфейсы для сохранения и запроса должны быть разными. В этом случае у вас будет Repo с базовыми операциями CRUD (GetById, GetAll, Save, Delete) и другим классом, который запрашивает вещи, основываясь на намерениях вашего приложения.

Надеюсь, это поможет.

Пол

3 голосов
/ 15 марта 2010

Это вопрос, который я недавно задавал, и, несмотря на несколько хороших ответов, я в итоге пришел к собственному выводу - правильного ответа нет. Это не значит, что нет неправильного ответа, потому что есть много неправильных ответов, но правильный ответ всегда будет зависеть от вашего индивидуального случая.

Я получил четыре хранилища и частичное расширение класса моей модели сущности EF4 для стандартных действий CRUD для дочерних сущностей (адреса, номера телефонов, коды состояния и т. Д.), Поэтому они были реализованы один раз и доступны во всех хранилищах , Тем не менее, я все еще совершенствуюсь, поэтому, возможно, я еще не нашел лучшего решения.

Мой совет: попробуйте и посмотрите, подходит ли он, и посмотрите, правильно ли он выглядит. Обычно, если он не чувствует себя правильным, это в любом случае неправильно.

Если вы действительно боитесь загромождать свое дерево исходного кода, вы всегда можете разбить часть модели на собственную библиотеку и включить ее в качестве зависимости.

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