Рекомендация. Как получить несколько репозиториев зависимостей в ActionController? - PullRequest
2 голосов
/ 24 января 2010

У меня есть InventoryController, который получает IInventoryRepository, однако мои потребности изменились, и теперь одному из методов контроллеров также нужно использовать еще 2 репозитория, ILoansRepository (для просмотра информации о заимствованных предметах) и еще один где можно найти некоторые статистические данные и дополнительную информацию.

Способ, которым это работает, заключается в том, что класс ViewModelBuilder, который вызывается из ActionMethod в InventoryController, то есть тот, который действительно нуждается в них. В настоящее время я передаю IInventoryRepository от контроллера к сборщику, но как мне теперь это сделать? Должен ли я вставить 3 репозитория в контроллер, а затем передать их сборщику, как я это делал сейчас? Или я должен просто сделать IoC.GetInstance ()? (хотя я думаю, что это анти-паттерн, не так ли?)

спасибо!

Ответы [ 3 ]

2 голосов
/ 25 января 2010

В подобных ситуациях в игру вступают следующие рекомендации:

  • Слишком много зависимостей - это запах, который вы нарушаете Принцип единой ответственности .
  • Не более четырех зависимостей. Это относительное руководство. Я лично стремлюсь иметь меньше; Я становлюсь беспокойным, как только добавляю третью зависимость (см. Первый пункт выше), но могу жить до четырех. Более того, и мне нужно провести рефакторинг.
  • Не берите зависимости просто для их передачи.

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

Однако, как я понимаю вашу текущую реализацию, вы просто передаете зависимости ViewModelBuilder (таким образом нарушая третий пункт). Несколько лучшим вариантом было бы определить его абстракцию (скажем, IViewModelBuilder) и внедрить его в контроллер вместо всех трех репозиториев.

Ни при каких обстоятельствах не следует прибегать к анти-шаблону локатора служб (IoC.GetInstance ()).

0 голосов
/ 25 января 2010
  1. Если ваш контроллер выполняет слишком много работы, разделите его на несколько.

  2. Если вы добавляете 3 репозитория просто для создания ViewModelBinder, не делайте: вместо этого вставьте (I) ViewModelBinder. Пусть контейнер IoC сделает свою работу и разрешит зависимости для вас; Более того, это упростит архитектуру, тестирование и т. д.

  3. Использование ServiceLocator / GetInstance не всегда можно избежать; иногда у вас нет «корневой» точки ввода, как у фабрики контроллеров MVC, и вы не можете управлять созданием объектов - например, связывателей моделей. Итак, я позволяю моим связующим для моделей (не строителям) вызывать GetInstance, но я делаю свой собственный «корень»: например, они вызывают GetInstance , а не GetInstance .

0 голосов
/ 24 января 2010

К большой ответственности за контролера.

Возможно, вам следует создать специальный сервис для обработки этого, и этот сервис должен использовать эти репозитории (через IoC) с автоматическим подключением через конструктор.

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