Внедрение зависимостей в конструктор ASP.NET MVC Controller - PullRequest
14 голосов
/ 27 августа 2009

Рассмотрим:

public class HomeController : Controller 
{
    private IDependency dependency;

    public HomeController(IDependency dependency) 
    {
        this.dependency = dependency;
    }
}

А тот факт, что контроллеры в ASP.NET MVC должны иметь один пустой конструктор по умолчанию, есть ли другой способ, кроме определения пустого (и, на мой взгляд, бесполезного) конструктора для DI?

Ответы [ 4 ]

8 голосов
/ 27 августа 2009

Если вы хотите иметь конструкторы без параметров, вам нужно определить собственную фабрику контроллеров. У Фила Хаака есть отличное сообщение в блоге на эту тему.

Если вы не хотите создавать свою собственную фабрику контроллеров, вы можете получить их предварительно в проекте ASP.NET MVC Contrib на codeplex / github.

7 голосов
/ 27 августа 2009

Вам не нужно иметь пустой конструктор, если вы настраиваете собственный ControllerFactory для использования структуры внедрения зависимостей, такой как Ninject , AutoFac , Castle Windsor и т. д. Большинство из них имеют код для CustomControllerFactory для использования своего контейнера, который вы можете использовать повторно.

Проблема в том, что фабрика контроллеров по умолчанию не знает, как передать зависимость. Если вы не хотите использовать упомянутую выше инфраструктуру, вы можете сделать то, что называется инъекцией зависимости бедняка:

public class HomeController : Controller
{

    private IDependency iDependency;

    public HomeController() : this(new Dependency())
    {
    }

    public HomeController(IDependency iDependency)
    {
        this.iDependency = iDependency;
    }
}
1 голос
/ 02 апреля 2010

Вы можете внедрить свою зависимость по свойству, например, см .: Впрыск по свойству Использование Ninject выглядит следующим образом:

[Inject]
public IDependency YourDependency { get; set; }
1 голос
/ 27 августа 2009

Взгляните на MVCContrib http://mvccontrib.github.com/MvcContrib/. У них есть фабрики контроллеров для ряда контейнеров DI. Виндзор, Карта структуры и т. Д.

...