我搜索得很高,并寻找有关使用 MEF 进行 DI 的示例。我知道它不是 DI,但从我听到的(真的在播客中听到)可以这样使用它……但我找不到任何博客文章或示例。
我已经在这个项目中使用了 MEF(以支持插件)并且认为也可以很好地利用 DI。
也许我在叫错树?
我搜索得很高,并寻找有关使用 MEF 进行 DI 的示例。我知道它不是 DI,但从我听到的(真的在播客中听到)可以这样使用它……但我找不到任何博客文章或示例。
我已经在这个项目中使用了 MEF(以支持插件)并且认为也可以很好地利用 DI。
也许我在叫错树?
这可以通过一个例子来描述。例如,假设您有一个核心库,所有定制应用程序都基于该库。称它为 MyCompany.Core。通常,您编写的每个应用程序都必须包含对 MyCompany.Core 的引用,然后应用程序必须负责引导和调用 MyCompany.Core 以按照正确的顺序启动相应的服务等。当您考虑到核心本身可能更好地了解它应该如何启动等时,这没有多大意义。
要使用 MEF 进行依赖注入,您的核心将执行以下操作:
[Import("/Application", typeof(IBespokeApplication))]
private IBespokeApplication bespokeApplication;
核心本身将包含应用程序启动代码,并且在启动所有服务后可能会调用类似这样的代码:
bespokeApplication.Start();
在定制应用程序中,您必须自己导出:
[Export("/Application", typeof(IBespokeApplication))]
public class MyApplication : IBespokeApplication
{
public void Start()
{
/* start app */
}
}
现在,定制应用程序可以包含对 MyCompany.Core 的直接引用,并且可以直接调用服务,或者您甚至可以将服务公开为导出并将它们导入应用程序。例如,在核心中:
[Export("/LoggingService", typeof(ILoggingService))]
public class NLogLoggingService : ILoggingService
{
/* ... */
}
然后在定制应用程序中:
[Import("/LoggingService", typeof(ILoggingService))]
private ILoggingService loggingService;
...当你想使用它时:
loggingService.LogInformation("My Message");
据我所知,这就是依赖注入的本质。