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

标签 c# dependency-injection mef

我现在正在使用 MEF,但我正在寻找的答案可能与 MEF 无关——这都是依赖注入(inject)——我只是在这里使用 MEF 术语作为示例。

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

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

alt text
(来源:microsoft.com)

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

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

最佳答案

就 MEF 而言,应用程序服务只是另一个可组合的部分。您可以组合的任何接口(interface)或类都可以充当服务。

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

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

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;
     }

     // ...
}

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

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

关于c# - 如何使用 say MEF 导出和导入应用程序服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555902/

相关文章:

c# - 使用setTimeout在javascript中倒数计时器

dependency-injection - 领域驱动设计和 IoC/依赖注入(inject)

java - 服务定位器与依赖注入(inject)

c# - 用于大量插件的 MEF

c# - MEF 从目录加载插件

c# - 从 LINQ to SQL 查询加载 DataGridView

C# 多重约束

c# - 按类型查找 WPF 窗口中的所有控件

android - 如何使用 Dagger 2 将上下文注入(inject) Presenter

c# - 如何让 DirectoryModuleCatalog 工作?