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

时间:2009-08-27 00:21:56

标签: asp.net-mvc dependency-injection

考虑:

public class HomeController : Controller 
{
    private IDependency dependency;

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

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

4 个答案:

答案 0 :(得分:8)

如果您想要无参数构造函数,则必须定义自定义控制器工厂。菲尔·哈克(Phil Haack)对这个问题有很好的blog post

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

答案 1 :(得分:7)

如果您设置自定义ControllerFactory以使用NinjectAutoFacCastle Windsor等依赖注入框架,则不必拥有空构造函数。其中大多数有一个CustomControllerFactory的代码来使用你可以重用的容器。

问题是,默认控制器工厂不知道如何传递依赖关系。如果你不想使用上面提到的框架,你可以做所谓的穷人的依赖注入:

public class HomeController : Controller
{

    private IDependency iDependency;

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

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

答案 2 :(得分:1)

看看MVCContrib http://mvccontrib.github.com/MvcContrib/。他们有许多DI容器的控制器工厂。温莎,结构图等。

答案 3 :(得分:1)

您可以按属性注入依赖项,例如:Injection by Property 使用Ninject看起来像这样:

[Inject]
public IDependency YourDependency { get; set; }