考虑:
public class HomeController : Controller
{
private IDependency dependency;
public HomeController(IDependency dependency)
{
this.dependency = dependency;
}
}
事实上,ASP.NET MVC中的控制器必须有一个空的默认构造函数,除了在DI中定义一个空的(在我看来是无用的)构造函数之外还有什么方法吗?
答案 0 :(得分:8)
如果您想要无参数构造函数,则必须定义自定义控制器工厂。菲尔·哈克(Phil Haack)对这个问题有很好的blog post。
如果您不想推出自己的控制器工厂,可以在codeplex / github的ASP.NET MVC Contrib项目中预先制作它们。
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
看看MVCContrib http://mvccontrib.github.com/MvcContrib/。他们有许多DI容器的控制器工厂。温莎,结构图等。
答案 3 :(得分:1)
您可以按属性注入依赖项,例如:Injection by Property 使用Ninject看起来像这样:
[Inject]
public IDependency YourDependency { get; set; }