[英]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.