Подтвердить что ты не робот

Решение шаблона шаблона MVC

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Пол

Ответ 2

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

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

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

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