Dependency injection 为DI/IoC使用MEF的资源和示例

Dependency injection 为DI/IoC使用MEF的资源和示例,dependency-injection,inversion-of-control,mef,Dependency Injection,Inversion Of Control,Mef,我已经搜索了很多关于使用MEF进行DI的示例。我知道它不是DI,但从我听到的(在播客中真正听到的)来看,它可以这样使用……但我找不到任何博客帖子或示例 我已经在这个项目中使用了MEF(以支持插件),并且认为利用DI也很好 也许我找错树了?这可以用一个例子来描述。例如,假设您有一个核心库,所有定制应用程序都基于该库。叫它MyCompany.Core。通常,您编写的每个应用程序都必须包含对MyCompany.Core的引用,然后应用程序必须负责引导和调用MyCompany.Core,以正确的顺序启动

我已经搜索了很多关于使用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");
据我从文献中所知,这就是依赖注入的本质