2009-08-27 118 views
14

构造函数依赖注入考虑:在ASP.NET MVC控制器

public class HomeController : Controller 
{ 
    private IDependency dependency; 

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

而事实上,在ASP.NET MVC控制器必须有一个空的默认构造函数有什么办法不是定义一个空其他(无用在我看来)DI的构造函数?

回答

8

如果你想拥有你必须定义一个定制的控制器工厂参数构造函数。关于这个问题,菲尔·哈克有一个很棒的blog post

如果你不希望推出自己的控制器工厂,你可以得到在CodePlex上/ GitHub上的ASP.NET MVC Contrib项目他们预先制作。

7

你不必有空的构造函数,如果你建立一个自定义的ControllerFactory使用像NinjectAutoFacCastle Windsor,等大多数它们的依赖注入框架具有代码为CustomControllerFactory用自己的容器,你可以重用。

的问题是,默认的控制器工厂不懂得绕道的依赖。如果你不想使用框架上面提到的,你可以做什么是所谓穷人的依赖注入:

public class HomeController : Controller 
{ 

    private IDependency iDependency; 

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

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

您可以通过属性注入你的依赖,例如参见:Injection by Property 使用Ninject看起来是这样的:

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