【问题标题】:MVC Controller with no parameterless constructor没有无参数构造函数的 MVC 控制器
【发布时间】:2013-09-11 16:41:11
【问题描述】:

现在我正在学习 MVC,但遇到了一个我无法弄清楚的问题。

在我下载的一个测试项目中,我可以看到一些控制器没有无参数构造函数,而是有一个有很多参数的构造函数。这怎么可能?

我的意思是,当有人访问一个页面时,必须首先创建一个控制器。创建控制器的东西必须使用无参数构造函数来创建它。

我想这是我在 MVC 中遗漏的东西。 :)

【问题讨论】:

  • 听起来除了开箱即用的 ASP.NET MVC 之外,这里还使用了其他东西。也许是一个依赖注入框架?
  • 检查参考文献,你可能有类似 Ninject 的东西?

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

这被称为构造函数注入,它被用作 Ninject 和 StructureMap 等依赖注入工具的基础。它允许对象的松散耦合。

基本上,每当您必须使用new 创建对象的实例时,您就是将自己与该对象的具体实现紧密耦合。如果不是不可能进行测试,这可能会使事情变得困难。

void MakeBacon()
{
    var smokey = new Bacon();
}

通过使用构造函数或依赖注入等注入方法,我们将自己松散耦合,因为我们不再需要创建新实例,而是将其注入。

void MakeBacon(IBacon smokey){
   // Make bacon here.
}

这是关于堆栈交换的一个很好的答案,解释了构造函数注入

What is constructor injection?

这是一篇关于构造函数注入的微软文章

Annotating Object for Constructor Injection

【讨论】:

  • 好的,但是如何将它硬塞到一个期望无参数构造函数的 MVC 控制器中?
  • @RobertHarvey 这是我们使用依赖注入工具的地方,例如 Ninject 和 StructureMap。在应用启动时,它们会注册依赖项。
  • 我想我没有说清楚。我说的是 ASP.NET MVC 控制器的特定情况,而不是 DI 的一般情况。如果 MVC 基础设施需要一个无参数的构造函数,你如何注入控制器?显然can be done,我只是不清楚注射是在哪里或如何发生的。
  • 检查你的 global.asax 它会有一个类似于提到的块 here
  • 最新版本的 MVC 原生支持依赖注入,您只需在应用启动时使用 DependencyResolver.SetResolver() 注册解析器。然后它将尝试使用该解析器解析构造函数的依赖关系。
【解决方案2】:

在没有看到代码的情况下,我的第一个想法是涉及到一些依赖注入(即 Ninject、Autofac 等),这会将构造对象(根据定义的规则)注入到构造函数中。如果您不熟悉控制反转和依赖注入模式,这里有一个堆栈溢出问题,它有一个非常清楚的解释: What is Inversion of Control?

如果发生了其他事情,那么也许您可以包含一些代码,以便我们查看它。

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 2010-09-12
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多