`

【Ray谈C#] MEF 扩展性管理框架

阅读更多
原文发表于:blogs.ejb.cc

MEF是做什么的?
在MEF诞生前,已经存在许多依赖注入框架来解决应用的扩展性问题,比如 EJB、CORBA、Eclipse 的 OSGI 实现以及 Java 端的 Spring 等等。在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin,此外还有不少开源解决方案,包括SharpDevelop 的SODA 体系结构和“控制反转”容器(如Castle Windsor、Structure Map、Spring.Net 以及Unity)。

在Microsoft看来,这些方案有些过于庞杂(比如OSGI),有些则需要开发人员完成许多额外工作(比如Spring),MEF试图秉承这些解决方案的优点,尝试解决刚才所提及的令人头痛的问题。MEF有两个优点:第一,MEF是开源项目,其源代码在Codeplex上可以下载,第二,MEF是第一个随CLR发布的扩展性管理的框架,而且在Visual Studio和Silverlight中被广泛应用。 官方给MEF下的定义:

Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等。MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序进行扩展并且对已有的代码产生最小的影响,开发人员在开发过程中根据功能要求定义一些扩展点,之后扩展人员就可以使用这些扩展点与应用程序交互;同时MEF让应用程序与扩展程序之间不产生直接的依赖,这样也允许在多个具有同样的扩展需求之间共享扩展程序。

概念

MEF 有几个基本核心概念:
可组合的部件(或简称“Part”)— 一个部件向其他部件提供服务,或使用其他部件提供的服务。MEF 中的部件可来自任何位置(应用程序内部或外部);从 MEF 的角度来看,这并无区别。
导出 — 导出是部件提供的服务。某个部件提供一个导出时,称为该部件导出 该服务。
导入 — 导入是部件使用的服务。某个部件使用一个导入时,称为该部件导入 该服务。
约定 — 约定是导出或导入的标识符。导出程序指定其提供的字符串约定,导入程序指定其需要的约定。MEF 从要导出和导入的类型派生约定名称,因此在大多数情况下,您不必考虑这一点。
组合 — 部件由 MEF 组合,MEF 将部件实例化,然后使导出程序与导入程序相匹配。

简短说一下MEF的工作原理,MEF的核心包括一个catalog和一个CompositionContainer。category用于发现扩展,而container用于协调创建和梳理依赖性。每个可组合的Part提供了一个或多个Export,并且通常依赖于一个或多个外部提供的服务或 Import。

MEF入门:寻找变化点

MEF是怎样工作的呢?我们来看最简单的“Hello,World”:
[code lang="C#"]
static void Main(string[] args)
{
      Console.WriteLine("Hello,World.");
}


如果某些业务要求,该字符串将来可能发生变化,也就是说这里有可能是一个变化点,也是一个扩展点,那我们现在使用MEF对其进行重新设计,我们将会把这个过程分成两个部分,一部分用于提供字符串:
[code lang="C#"]
    public class StringProvider
    {
        [Export("Message")]
        public String Output
        {
            get { return "Hello,World"; }
        }
    }


我们为Output属性添加了一个Export特性,这标识着此处有一个输出,它使的MEF能够对其进行识别。
我们再定义一个输入,即用来消费该字符串,同样是一个简单的属性,不过这次添加的是Import特性:
[code lang="C#"]
    public class Client
    {
        [Import("Message")]
        private String message=null;
         public void print()
        {
            Console.WriteLine(this.message);
        }
    }

这样就完成了导入导出的接口与实现的开发及特性配置。就剩下一步组合了:
[code lang="C#"]
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace cc.ejb.blogs.example
{
    class Program
    {
        static void Main(string[] args)
        {
            CompositionContainer container = new CompositionContainer();
            CompositionBatch batch = new CompositionBatch();
            Client client = new Client();
            batch.AddPart(new StringProvider());
            batch.AddPart(client);
            container.Compose(batch);

        }
    }
}


这里我们创建了一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)添加到容器中即可。实际应用中,通常会定义许多导入(Import)和导出(Export)部件,这里MEF提供了不同的组合方式, 可以通过程序集(AssemblyCatalog)或目录(DirectoryCatalog) 或二者结合等方式绑定可扩展的对象。

通过程序集:
[code lang="C#"]
CompositionContainer container = new CompositionContainer(new AssemblyCatalog(typeof(Client).Assembly));
Client client = new Client();
container.SatisfyImportsOnce(client);
client.print();


也可以使用DirectoryCatalog,则在该目标路径下的所有程序集都会被遍历查询:
[code lang="C#"]
CompositionContainer container = new CompositionContainer(new DirectoryCatalog(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"*.exe"));
Client client = new Client();
container.SatisfyImportsOnce(client);
client.print();

稍提一下, DirectoryCatalog默认的SearchPattern是"*.dll",这里改成"*.exe",这样我们的assembly才会被正确加载。

也可以二者相结合:
[code lang="C#"]
AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(Client).Assembly));
CompositionContainer _container = new CompositionContainer(catalog);
...


分享到:
评论

相关推荐

    C#MEF简单例子

    MEF 是一个由 Microsoft 开发的框架,用于实现应用程序的可扩展性和模块化。它提供了一种简单的方式来组合不同的组件,以创建一个功能强大且灵活的应用程序。 MEF 的主要概念 1. 组件(Component): MEF 中的组件...

    C# MEF使用实例

    通过理解并熟练运用上述知识点,开发者可以利用MEF构建出具有高度可扩展性和灵活性的应用程序,降低系统的耦合度,提高代码的可维护性。在实际项目中,MEF提供的功能可以帮助我们实现模块化设计,使代码更加清晰和...

    MEF框架整理学习内容

    **Managed Extensibility Framework (MEF)**,即托管可扩展性框架,是Microsoft在.NET平台下推出的一个用于解决应用程序扩展性的框架。在MEF发布之前,业界已经有多种依赖注入框架来解决软件系统的扩展性问题,例如...

    MEF可扩展框架实现简易例子

    实现了一个MEF可扩展框架的简易例子,可参考MEF是如何实现并工作的

    C# MEF Demo 使用例子,学会使用Mef

    MEF,即Managed Extensibility Framework,是.NET框架的一部分,由微软提供,用于构建可扩展的应用程序。它允许开发者轻松地创建、发现和组合应用程序组件,为软件提供灵活的插件架构。MEF在C#中的应用广泛,尤其在...

    MEF框架源代码 MEF框架源代码 MEF框架源代码

    MEF(Managed Extensibility Framework,管理可扩展性框架)是.NET Framework中一个强大的插件化框架,由微软开发并引入。MEF的主要目的是简化应用程序的可扩展性和模块化,使得开发者可以轻松地添加、替换或更新...

    MEF(Managed Extensibility Framework)入门教程

    MEF(Managed Extensibility Framework)是微软.NET框架下的一个受管理扩展性框架,主要用于提高应用程序和组件的复用程度。它最初是作为.NET Framework 4.0的一部分推出的,但由于其强大功能,在.NET 3.5版本中也...

    vs-mef, Visual Studio 使用的托管扩展性框架( MEF ) 实现.zip

    vs-mef, Visual Studio 使用的托管扩展性框架( MEF ) 实现 ( 管理扩展性框架工作室的视觉风格) 特性一个新的,更快的主机,为你现有的MEF部件重用已经使用的MEF属性ExportFactory<T> 支持创建具有作用域生命周期的子...

    Prism框架实例、MEF框架实例

    本解决方案中包含3个程序,1、简单的LocalDB数据的连接,项目名称是LocalDBOperate;2、Prism框架的简单实例,项目名称是Desktop.MainWindow;3、MEF的简单实例,项目名称MEFTest

    C# MEF样例功能测试代码

    MEF,全称为Managed Extensibility Framework(托管扩展框架),是.NET Framework的一部分,提供了一种在C#应用中实现插件式架构和依赖注入(DI)的方式。它允许开发者轻松地添加、替换或扩展应用程序的功能,而无需...

    WPF 使用Caliburn.Micro搭建MEF插件化框架

    总结来说,结合WPF、Caliburn.Micro和MEF,我们可以构建一个高度可扩展的应用程序框架,允许开发者轻松地添加、修改和删除功能模块。这种架构方式在大型企业应用或需要频繁迭代的项目中尤其有用,因为它促进了代码的...

    MEF简单模型

    MEF简单模型展示了如何利用MEF库实现插件式开发,将功能模块化,提高代码的可维护性和扩展性。通过定义部件、导入和导出,以及利用容器来管理和连接这些元素,我们可以构建出灵活且可扩展的应用程序。在这个具体的...

    扩展性MEF.rar111

    MEF(Managed Extensibility Framework,托管可扩展性框架)是.NET Framework的一个组件,由微软开发,主要用于构建可扩展的应用程序。它提供了一种方式来发现、加载和组合应用程序中的模块,使得开发者能够轻松地...

    MEF框架入门

    MEF(Managed Extensibility Framework)是微软推出的一种框架,旨在增强.NET应用程序的扩展性和组件重用性。它允许开发者创建动态组合的应用程序,使得在运行时可以方便地添加、修改或移除功能模块,无需重新编译...

    MefSimpleCalculator:演示如何使用 MEF(托管扩展性框架)的示例

    MefSample 计算器==================== 示例 MEF(托管可扩展性框架)示例要编译和运行此项目,您需要指定 Extensions 文件夹的路径。 打开主代码文件 (Program.cs)。 将扩展 DLL 复制到扩展文件夹要测试此项目,请...

    C#插件系统MEF(好用).rar

    Microsoft Managed Extensibility Framework (MEF) 是.NET Framework提供的一种强大的插件化框架,它为C#开发者提供了轻量级、可扩展的解决方案,使得开发者能够构建松耦合、易于维护的应用程序。 MEF的核心概念...

    MEF 插件化开发简单案例

    MEF 让扩展不仅可在应用程序内重复使用,还可以跨程序重复使用。传统的 C/S 端开发,如果项目不是特别复杂,常规的开发模式还是可以应对的。但是一旦场景复杂度提升,一个小小业务功能的修改就需要更新整个客户端,...

    MEF模块解耦,WCF Rest 扩展 基础示例

    MEF(Managed Extensibility Framework)是.NET框架中一个用于构建可扩展应用程序的库,它提供了模块化和解耦的功能。在本示例中,我们将深入探讨如何利用MEF实现应用模块之间的解耦,以及如何将WCF(Windows ...

Global site tag (gtag.js) - Google Analytics