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

C# 如何使用say MEF导出和导入应用程序服务?,c#,dependency-injection,mef,C#,Dependency Injection,Mef,我现在正在使用MEF,但我要寻找的答案可能与MEF无关——这都是依赖注入——我只是以MEF术语为例 简短的背景故事,我在MSDN上读了这篇文章,重点是 在这个图中有三样东西,shell、应用程序服务和模块。这是一个复合应用程序 (来源:) 我没有完全理解的是应用程序服务部分。服务是什么,看起来像什么?如何通过模块公开服务,以及如何使用来自不同模块的服务 我真的很想看到一些简洁的小代码示例,没有什么特别的,只是一些东西来说明所有这些是如何实现的(应用程序服务部分)。为服务声明接口,并导出实现此接

我现在正在使用MEF,但我要寻找的答案可能与MEF无关——这都是依赖注入——我只是以MEF术语为例

简短的背景故事,我在MSDN上读了这篇文章,重点是

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


(来源:)

我没有完全理解的是应用程序服务部分。服务是什么,看起来像什么?如何通过模块公开服务,以及如何使用来自不同模块的服务


我真的很想看到一些简洁的小代码示例,没有什么特别的,只是一些东西来说明所有这些是如何实现的(应用程序服务部分)。

为服务声明接口,并导出实现此接口的类。 例如,您可能在共享程序集中声明了
IPersonBuilder
。您的主模块有
MyPersonBuilder
实现接口并导出此接口。
所有视图都使用imports
IPersonBuilder
对其调用方法,并且使用MEF组合,它们将能够从主模块调用
MyPersonBuilder
上的say
CreatePerson()

应用程序服务,就MEF而言,只是另一个可组合的部分。您可以编写的任何接口或类都可以像服务一样工作

每个服务都有一些要实现的接口或基类。您可以通过某种类型的
IService
接口(并使用
[ImportMany]
将它们全部导入),但通常需要不同的服务类型

然后根据需要将其导入到类中。例如,假设您有一个用于服务的公共接口库,并且您提供:

public interface IDataRepostory
{
     public IList<MyType> MyTypes { get; }
}
然后,您的主程序将能够根据需要导入此文件,并针对其编写代码。例如,假设要显示客户,则需要从数据层加载客户。如果希望通过存储库加载,可以将存储库导入应用程序的特定部分:

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

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


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

是的,图片中的颜色选择很糟糕……如果超过一个应用程序服务满足导入要求,您将如何区分这两个应用程序服务?元数据?还是有更好的办法?或者这是错误的。我知道MEF在发生这种情况时会抛出一个异常,所以我真的只需要一个接口和一个具体的实现吗?@John:你必须使用[ImportMany],然后查询服务或使用元数据来确定使用哪个。否则,您将得到一个例外。@John:如果多个服务使用相同的导入接口/类,那么请使用[ImportMany]并将其导入到IEnumerables中,这样复合应用程序中的所有内容都是应用程序服务?这一切都非常整洁。。。然而,一开始就让人很困惑。。。谢谢你帮我解决了一些问题。我不知道现在是什么情况,但这肯定会有帮助,但不会免费解决我的问题。为了保持一个好的设计,有什么我应该特别小心并尽量避免的吗?
public class CustomersViewModel
{
     [Import]
     public IDataRepository
     {
         get; set;
     }

     // ...
}