现在我正在学习MVC,但遇到了一个我无法弄清楚的问题。
在我下载的测试项目中,我可以看到一些控制器没有无参数构造函数,而是有一个具有许多参数的构造函数。怎么可能?
我的意思是,当有人访问某个页面时,必须首先创建一个控制器。创建控制器的东西必须使用无参数构造函数创建它。
我想这是我在MVC中遗漏的东西。 :)
答案 0 :(得分:4)
在没有看到代码的情况下,我首先想到的是涉及一些依赖注入(即Ninject,Autofac等等),它会将构造对象(从定义的规则)注入到构造函数中。如果您不熟悉控制反转和依赖注入模式,这里有一个堆栈溢流问题,它有一个非常明确的解释: What is Inversion of Control?
如果还有其他事情发生,那么也许您可以包含一些代码,以便我们可以查看它。
答案 1 :(得分:4)
这称为构造函数注入,它用作依赖注入工具(如Ninject和StructureMap)的基础。它允许物体松散耦合。
基本上,每当您必须使用new
创建对象的实例时,您就会将自己与该对象的具体实现紧密结合。如果不是不可能的话,这可能会使事情变得困难。
void MakeBacon()
{
var smokey = new Bacon();
}
通过使用构造函数或依赖注入等注入方法,我们松散地耦合自己,因为我们不再需要创建新实例,而是注入它。
void MakeBacon(IBacon smokey){
// Make bacon here.
}
这是解释构造函数注入的堆栈交换的一个很好的答案
What is constructor injection?
这是关于构造函数注入的Microsoft文章