如何使用MEF导出和导入应用程序服务?

时间:2010-03-31 19:31:53

标签: c# dependency-injection mef

我现在正在与MEF合作,但我正在寻找的答案可能与MEF无关 - 它是所有依赖注入 - 我只是在这里使用MEF术语作为示例。

简短的背景故事,我在MSDN上阅读了这篇文章,主要关注Composite Applications

在这个图中有三个东西,shell,应用程序服务和模块。所以这是一个复合应用程序。

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

我没有完全得到的是应用程序服务部分。什么是服务,它是什么样的?如何通过模块公开服务以及如何使用不同模块的服务?

我真的很想看到一些简洁的小代码示例,没有任何花哨的东西可以说明这一切是如何实现的(应用程序服务部分)。

2 个答案:

答案 0 :(得分:3)

就MEF而言,应用服务只是另一个可组合的部分。您可以撰写的任何界面或类都可以像服务一样。

每个服务都有一些您想要实现的接口或基类。您可以通过某种类型的IService界面集中进行这些操作(并使用[ImportMany]将它们全部导入),但通常情况下,您需要不同的服务类型。

然后,您可以根据需要将其导入到您的课程中。例如,假设您有一个用于服务的通用接口库,并提供:

public interface IDataRepostory
{
     public IList<MyType> MyTypes { get; }
}

然后,您可以拥有单独的库导出特定类型:

[Export(typeof(IDataRepository))]
public class Repository: IDataRepostory
{
    // implement interface for this specific "service"
}

然后您的主程序可以根据需要导入它,并针对它编写代码。例如,假设您想要显示客户,则需要从数据层加载客户。如果要通过存储库加载,可以将存储库导入应用程序的特定部分:

public class CustomersViewModel
{
     [Import]
     public IDataRepository
     {
         get; set;
     }

     // ...
}

然后,您可以直接将此服务组合到您的应用程序中。

这被视为“应用程序服务”,因为它是某些通用服务的特定于应用程序的实现 - 它不是与视图相关的组件,并且可以在整个应用程序中使用。

答案 1 :(得分:0)

声明实现此接口的服务和导出类的接口。 例如,您可能在共享程序集中声明IPersonBuilder。你是主模块有MyPersonBuilder实现接口并导出它。 所有视图都使用导入IPersonBuilder来调用方法,并使用MEF合成,他们将能够从您的主模块调用CreatePerson()上的MyPersonBuilder