MEF简单学习笔记

首先,最基本的还是先要知道MEF是撒,他是干嘛用的:http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx

(1)MEF:全称Managed Extensibility Framework(托管可扩展框架)。

(2)MSDN上说明:Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。

(3)工作原理:(这个我看别人的复制黏贴了)

Export(导出): “Export”也就是我们常说的组件或者模块或者服务,它是部件向容器中的其他部件提供的一个值、功能或服务等;

Import(导入): "Import”,既扩展点,是组件,服务等接入系统的窗口是部件向要通过可用导出满足的容器提出的要求,MEF 支持若干导入类型,其中包括动态导入、延迟导入、必备导入和可选导入

Contract(协定):是Export和Import的一种约定,一种协议,只有Contract相匹配的Import和Export部件才能组装成功;

Catalog(目录):为了发现可用于组合容器的部件,组合容器将使用“Catalog”。 目录是一个对象,通过它发现可用部件, MEF 提供了用于从提供的类型、程序集或磁盘路径创建Catalog。

Compose(组合):在MEF中,容器将导入与导出匹配的这一过程我们称之为组合,部件由 MEF 组合,MEF 将部件实例化,然后使导出程序与导入程序相匹配。

先弄一个最简单的HelloWorld例子来试一下:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.Reflection;
using System.ComponentModel.Composition.Hosting;

namespace HelloMEF{
    class Program {
        public string Message { get; set; }
        static void Main(string[] args) {
            Program program = new Program();
            program.Run();
        }

        private void Run() {
            SimpleHello simpleHello = new SimpleHello();
            Message = simpleHello.Message;
            Console.WriteLine(Message);
            Console.ReadKey();
        }
    }
    public class SimpleHello {
        public string Message {
            get { return "Hello World!"; }
        }
    }
}

上面这个是普通的提取字符串,但是这样就紧耦合了。要把耦合给去掉,先添加一个引用:System.ComponentModel.Composition.dll,先要有一个宿主,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可

            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);

然后分别在两个类中加入[Import]和[Export]即可,导入和导出有许多种,譬如如果需要导入多个类的东西的话还需要[ImportMany]等操作:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.Reflection;
using System.ComponentModel.Composition.Hosting;

namespace HelloMEF {
    class Program {
        [ImportMany]
        public IEnumerable<string> Message { get; set; }
        static void Main(string[] args) {
            Program program = new Program();
            program.Run();
        }

        private void Run() {
            //SimpleHello simpleHello = new SimpleHello();
            //Message = simpleHello.Message;
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
            foreach (var msg in Message) {
                Console.WriteLine(msg);
            }
            Console.ReadKey();
        }
    }
    public class SimpleHello {
        [Export]
        public string Message {
            get { return "Hello World!"; }
        }
    }
    public class HelloAgain {
        [Export]
        public string Message {
            get { return "Hello World Again!"; }
        }
    }
}

这个要参考一下这个导入导出的,里面写的还是挺全的:

http://www.cnblogs.com/pszw/archive/2011/12/04/2276241.html  http://www.cnblogs.com/pszw/archive/2011/12/09/2282755.html

这只是一个最简单的例子。其他的容我再深入的研究下~

原文地址:https://www.cnblogs.com/socialdk/p/2725937.html