ASP.NET MVC控制器中的构造函数依赖注入

Fin*_*las 14 asp.net-mvc dependency-injection

考虑:

public class HomeController : Controller 
{
    private IDependency dependency;

    public HomeController(IDependency dependency) 
    {
        this.dependency = dependency;
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上,ASP.NET MVC中的控制器必须有一个空的默认构造函数,除了在DI中定义一个空的(在我看来是无用的)构造函数之外还有什么办法吗?

Joh*_*esH 8

如果要使用无参数构造函数,则必须定义自定义控制器工厂.Phil Haack有一篇关于这个主题的精彩博文.

如果您不想滚动自己的控制器工厂,可以在codeplex/github 的ASP.NET MVC Contrib项目中预先制作它们.


Dal*_*gan 7

如果您设置自定义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;
    }
}
Run Code Online (Sandbox Code Playgroud)