2

我搜索得很高,并寻找有关使用 MEF 进行 DI 的示例。我知道它不是 DI,但从我听到的(真的在播客中听到)可以这样使用它……但我找不到任何博客文章或示例。

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

也许我在叫错树?

4

1 回答 1

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 的直接引用,并且可以直接调用服务,或者您甚至可以将服务公开为导出并将它们导入应用程序。例如,在核心中:

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

然后在定制应用程序中:

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

...当你想使用它时:

loggingService.LogInformation("My Message");

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

于 2009-06-26T22:50:30.480 回答