Контроллер .NET MVC с несколькими хранилищами и службами? - PullRequest
5 голосов
/ 08 сентября 2011

Посмотрите на мой контроллер (я использую Dependency Injection для зависимостей менеджера):

public RoleController(IRoleRepository roleRepository, ISiteRepository siteRepository, IUserRepository userRepository, IDbContext dbContext)
{
    _roleRepository = roleRepository;
    _siteRepository = siteRepository;
    _userRepository = userRepository;
    _dbContext = dbContext;
}

Наличие класса с множеством зависимостей - это запах кода? Правильно?

Но, в моем примере мне нужно связать Users и Sites в Role, тогда мне нужны эти зависимости для выполнения этой ассоциации.

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

Обновление:

Мне нужны репозитории и DbContext, потому что DbContext - это мой UnitOfWork, репозитории не сохраняются.

Этот пример представляет собой простой CRUD с некоторыми другими функциями, такими как Ассоциации в представлении с GRID.

Обновление 2:

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

1 Ответ

8 голосов
/ 08 сентября 2011

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

Однако, если вы действительно хотите ограничить количество зависимостей в этом конкретном случае, может иметь смысл создать MembershipService, который выполняет всю работу, связанную с Users, Sites и Roles. Тогда это будет зависеть от этих трех репозиториев, а ваш контроллер будет зависеть только от службы членства.


В ответ на ваше обновление: вы можете зарегистрировать единицу работы (т. Е. Контекст БД) как синглтон «на веб-запрос» - это возможно с Castle Windsor и многими другими DI-структурами. Затем вы можете позволить своим репозиториям зависеть от него и делать все изменения, и позволить контроллеру зависеть от него при сохранении, и все они получат один и тот же экземпляр, передаваемый им инфраструктурой DI.

...