将 MEF 与 MVC 结合使用

本文关键字:结合 MVC MEF | 更新日期: 2023-09-27 18:35:10

我开始在我的MVC应用程序中使用MEF,以便它遵循SOLID Priciples。

我上周问了这个问题:依赖关系是否应该注入比需要的"级别"高很多? 我(在评论中)问的部分问题是,如果你有两个构造函数;

一个用于依赖注入的构造函数

另一个没有参数的构造器

并且没有参数的结构函数实例化所需依赖项的实例,那么这应该使服务定位器变得毫无意义。响应是类不应该实例化它自己的依赖项。好的,我明白了,但是看看这个关于 MEF 的 MS 教程:

http://msdn.microsoft.com/en-us/library/hh708870(v=vs.110).aspx

他们说你应该有两个构造函数:

 public HomeController() : this(new TraceLogger())
  {
  }
public HomeController(ILogger logger)
{
    _logger = logger;
}

但是从我被告知的情况来看,第一个构造函数是禁忌,因为类正在实例化它自己的依赖项?

另外,在教程中,MS只是说;将第二个构造器替换为:

    public HomeController([Import("myTraceLogger")]ILogger logger)
    {
        _logger = logger;
    }

这有什么意义呢?我仍然需要提供 ILogger 的实例......除非我错过了什么?我删除了默认构造函数:

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

应用程序只是说:"没有为此对象定义无参数构造函数。所以我必须提供一个实例,因为如果 MEF 正在创建一个新实例,那么它肯定会在没有默认构造函数的情况下工作......如果没有,使用 MEF 有什么意义?我还不如自己做依赖注入。

将 MEF 与 MVC 结合使用

听起来你需要在

HomeController(ILogger)构造函数上使用[ImportingConstructor]属性。这样:

[ImportingConstructor]
public HomeController([Import("myTraceLogger")]ILogger logger)
{
    _logger = logger;
}

MEF 创建ILogger的单一实例(默认情况下)。它将确保在创建HomeController类之前创建ILogger

在创建具有导出类型的对象列表作为某些运行时工作流的一部分时,服务定位器非常方便。

好的。所以你可以使用 MEF 进行依赖注入并注入零件,但我个人不会。我在上面看到的表现非常糟糕。如果您错误地使用它,它也很容易泄漏和消耗内存。

您可以将坚实的原则与其他技术结合使用。使用众所周知的控制反转 (IoC) 容器,例如 StructureMap 或 AutoFac。可以将 nuget 包添加到 MVC 应用,在全局 asax 中编写几行安装代码,构造函数将自动工作。这些也更宽容,更容易设置和配置。

当应用程序启动并创建 IoC 容器时(或首次请求对象时,具体取决于您的设置),依赖项将"新建"并注入到类构造函数中。实际上,如果您类请求 ILogger,除了告诉 IoC 容器在哪里可以找到 Logger 类的实例(即在哪个程序集中)之外,您不需要做太多事情。

public HomeController(ILogger logger)
{
    _logger = logger;
}

看看这些帖子。

  • 结构图网站
  • 如何让结构图与AngularJs/MVC5 和 WebApi2 Web 项目
  • 如何配置MVC 5 asp.net 的结构图