繁体   English   中英

将MEF与MVC结合使用

[英]Using MEF with MVC

我开始在我的MVC应用程序中使用MEF,因此它遵循SOLID原则。

上周,我问了这个问题: 依赖关系是否应该注入比需要多的“层次”? 我问(在评论中)的部分内容是,如果您有两个构造函数;

依赖注入的一个构造函数

另一个没有参数的构造函数

没有参数的构造函数实例化所需依赖项的实例,然后这应该使服务定位器无济于事。 对此的回应是,一个类不应实例化其自身的依赖关系。 好,我明白了,但是看一下关于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;
}

但是据我所知,第一个构造函数是no-no,因为该类实例化了它自己的依赖关系?

另外,在教程中,MS只是说; 以此替换第二个构造函数:

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

这有什么意义? 我仍然必须提供ILogger的实例...除非我缺少什么? 我删除了默认构造函数:

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

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

听起来您需要在HomeController(ILogger)构造函数上使用[ImportingConstructor]属性。 像这样:

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

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

当您在某些运行时工作流中创建带有导出类型的对象列表时,服务定位器很方便。

好。 因此,您可以使用MEF进行依赖注入并注入零件,但就我个人而言,不会。 我所看到的性能非常糟糕。 如果使用不当,它也容易泄漏并消耗内存。

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

当您的应用程序启动并创建IoC容器时(或根据设置首次请求对象时),该依赖项将被“新建”并注入到类构造函数中。 实际上,如果您类向IoC容器请求ILogger,则无需告诉IoC容器在哪里可以找到Logger类的实例(即在哪个程序集中)。

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

查看这些帖子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM