MVC 3: внедрение нескольких репозиториев в один контроллер - PullRequest
3 голосов
/ 16 августа 2011

Мой уровень представления находится в MVC 3.

У меня есть уровень доступа к данным, который возвращает репозитории.Каждый репозиторий сопоставлен с одной таблицей.

Например, у меня есть следующие интерфейсы репозитория:

  • ICustomerRepository
  • ICustomerTypeRepository

У меня есть реализации Entity Framework этих репозиториев,Эти реализации внедряются во время выполнения с Ninject.

У меня есть два контроллера:

  • CustomerController
  • CustomerTypeController

Каждый контроллер имеет набор подпрограмм CRUD.У клиента должен быть тип.

Чтобы создать запись о клиенте, мне нужно использовать EFCustomerTypeRepository.

Теперь у меня есть конструктор в CustomerController, который выглядит следующим образом:

public class CustomerController: Controller
{
   private ICustomerRepository customerRepository;        
   private ICustomerTypeRepository customerTypeRepository; 

   public CustomerController(ICustomerRepository customerRepository, 
                             ICustomerTypeRepository customerTypeRepository)
   {
      this.customerRepository = customerRepository;            
      this.customerTypeRepository = customerTypeRepository;
   }     

...

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

Я мог бы хранить всю эту логику в EFCustomerRepository, однако это нарушит принцип единой ответственности.Так что я не собираюсь этого делать.

Наконец, я могу обернуть эти репозитории и передать один объект типа RepositoryWrapper на мой контроллер.

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

Я использую MVC 3, EF 4.1, Ninject, Moq и Automapper.Спасибо

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

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

0 голосов
/ 18 июня 2012

В любом случае, внедрение нескольких репозиториев в конструктор контроллера не обязательно является плохой практикой. Это называется «избыточным внедрением в конструктор», см. Книгу Марка Симанна на эту тему.

...