Контроллеры IoC и ASP.NET MVC - PullRequest
5 голосов
/ 05 июня 2009

Должен ли я сделать что-то подобное? Я думаю о всех моих контроллерах, наследуемых от BaseController Это нарушает шаблон дизайна IoC? Что еще я должен сделать вместо этого?

public class BaseController: Controller
{
    protected ICookieService CookieService {
        get {
            return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext });
        }
    }
    protected IDateTimeService DateTimeService { 
        get {
            return ServiceResolver.Resolve<IDateTimeService>();
        }
    }
    protected ISettingsService SettingsService {
        get {
            return ServiceResolver.Resolve<ISettingsService>();
        }
    }

}

Ответы [ 3 ]

10 голосов
/ 05 июня 2009

Было бы намного проще пойти с инжектором конструктора и сделать так, чтобы контроллер вводил его для вас. Если вы можете, не используйте указатель службы (ваш ServiceResolver), если вы можете избежать инъекций в конструктор.

Есть некоторая информация об этом Добавление фабрики контроллеров в ASP MVC

Ссылка показывает, как это сделать с StructureMap, и похоже, что вы используете Unity, но это должно быть легко адаптироваться.

0 голосов
/ 05 июня 2009

Один из принципов Инверсия управления и Компонентно-управляемая разработка - это примерно с использованием статических сервисных локаторов, только когда нет другого способа (то есть: в хостах веб-служб или источниках данных объекта).

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

Проверьте существующую интеграцию между контейнером Autofac IoC и ASP.NET MVC (другие контейнеры также должны это делать).

0 голосов
/ 05 июня 2009

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

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