使用MEF进行DI / IoC的资源和示例

时间:2009-06-25 13:36:07

标签: dependency-injection inversion-of-control mef

我已经搜索过高,并寻找有关使用MEF进行DI的样本。我知道它不是DI而是从我所听到的(真的在播客中听到)它可以这样使用......但我找不到任何博客文章或样本。

我已经在这个项目中使用MEF(支持插件),并认为利用DI也很好。

也许我在咆哮错误的树?

1 个答案:

答案 0 :(得分:2)

这可以通过一个例子来描述。例如,假设您有一个基于所有定制应用程序的核心库。称之为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的直接引用,并且可以直接调用服务,或者甚至可以将服务公开为Exports并将它们导入应用程序。例如,在核心:

[Export("/LoggingService", typeof(ILoggingService))]
public class NLogLoggingService : ILoggingService
{
    /* ... */
}

然后在定制的应用程序中:

[Import("/LoggingService", typeof(ILoggingService))]
private ILoggingService loggingService;

...当你想要使用它时:

loggingService.LogInformation("My Message");

据我所知,这是依赖注入的本质。