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