Инъекция зависимостей конструктора в контроллере ASP.NET MVC
Рассмотрим:
public class HomeController : Controller
{
private IDependency dependency;
public HomeController(IDependency dependency)
{
this.dependency = dependency;
}
}
И тот факт, что контроллеры в ASP.NET MVC должны иметь один пустой конструктор по умолчанию, есть способ, отличный от определения пустого (и бесполезного на мой взгляд) конструктора для DI?
Ответы
Ответ 1
Если вы хотите иметь конструкторы без параметров, вы должны определить пользовательский контроллер factory. У Фила Хаака есть замечательный пост в блоге о предмете.
Если вы не хотите откатывать свой собственный контроллер factory, вы можете получить их заранее в ASP.NET MVC Contrib проект в codeplex/github.
Ответ 2
Вам не нужно иметь пустой конструктор, если вы настраиваете пользовательский ControllerFactory для использования инфраструктуры инъекций зависимостей, например Ninject, AutoFac, Castle Windsor и т.д. Большинство из этих иметь код для CustomControllerFactory для использования своего контейнера, который вы можете повторно использовать.
Проблема заключается в том, что контроллер по умолчанию factory не знает, как передать зависимость. Если вы не хотите использовать фреймворк, упомянутый выше, вы можете сделать так называемую инъекцию зависимости бедных людей:
public class HomeController : Controller
{
private IDependency iDependency;
public HomeController() : this(new Dependency())
{
}
public HomeController(IDependency iDependency)
{
this.iDependency = iDependency;
}
}
Ответ 3
Взгляните на MVCContrib http://mvccontrib.github.com/MvcContrib/. У них есть контрольные заводы для ряда контейнеров DI. Виндзор, Структурная карта и т.д.
Ответ 4
Вы можете ввести свою зависимость с помощью свойства, например,: Injection by Property
Использование Ninject выглядит следующим образом:
[Inject]
public IDependency YourDependency { get; set; }