MEF是微软提供的一个轻量级的ICO容器,可以轻易的解除程序集的依赖关系,最近想写个类似插件试的软件所以搜索了一下,终于淘到宝了。

下面我们看看MEF是如何解耦的

新建一个控制台项目两个类库

Itest中添加接口文件Istudent

namespace ITest

{

public interface   IStudent

{

string Say(string msg);

}

}

Test中添加引用

添加Student类文件;

using ITest;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.ComponentModel.Composition;//添加引用

namespace Test

{

[Export(typeof(IStudent))]//用于输出类行

public class Student:IStudent

{

public string Say(string msg)

{

return "你好:" + msg;

}

}

}

控制台程序中也添加引用

注意只添加了接口类库的引用,并没有添加Test类库的引用;

编写主函数:

using ITest;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;

using System.IO;

namespace MEF

{

class Program

{

[Import]//MEF导入特性标签,用于实例化;

public IStudent student { get; set; }

static void Main(string[] args)

{

Program p = new Program();

p.Deal();

}

public void Deal()

{

AggregateCatalog catelog = new AggregateCatalog();

catelog.Catalogs.Add(new DirectoryCatalog("..\\..\\..\\Test\\bin\\Debug"));//根据相对路径去找对象;

CompositionContainer container = new CompositionContainer(catelog);//声明容器

container.ComposeParts(this);//把容器中的部件组合到一起

Console.WriteLine(student.Say("干嘛去?"));

Console.Read();

}

}

}

总结:

MEF自动将  [Export(typeof(IStudent))]和[Import]指定的两个对象进行绑定,帮助我们完成实例化;

MEF实例化对象只需要四部,

  1. 创建合并对象目录AggregateCatalog实例
  2. 根据地址添加目录到对象中;
  3. 创建容器对象,
  4. 绑定导入和导出的对象,完成实例化;

参考文档:

http://www.cnblogs.com/techborther/archive/2012/02/06/2339877.html

原来写插件还可以选MEF的更多相关文章

  1. 关于jQuery写插件及其演示

    关于写jQuery插件是非常有必要的.这是前端学习其中必须经过的一个过程 对于初次写插件先想清楚原理       (function($){  $.fn.yourName = function(opt ...

  2. 自己动手写插件底层篇—基于jquery移动插件实现

    序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...

  3. .Net插件编程模型:MEF和MAF[转载]

    .Net插件编程模型:MEF和MAF MEF和MAF都是C#下的插件编程框架,我们通过它们只需简单的配置下源代码就能轻松的实现插件编程概念,设计出可扩展的程序.这真是件美妙的事情! 今天抽了一点时间, ...

  4. js写插件教程

    <!doctype html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. js写插件教程入门

    原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处   1. 点击add可以添加个自input的内容到div里并实现变颜色 <div id=& ...

  6. 【jQuery】结合accordion插件分析写插件的方法及注意事项

    1.jQuery插件的命名方式:jquery.[插件名].js 2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上 3.插件内部this指向的是通过选择器获取的jQuery对 ...

  7. 为jQuery写插件

    很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...

  8. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  9. zTree插件之多选下拉菜单代码

    zTree插件之多选下拉菜单代码 css和js <!--ztree树结构--> <link rel="stylesheet" type="text/cs ...

随机推荐

  1. 【POJ2728】Desert King - 01分数规划

    Description David the Great has just become the king of a desert country. To win the respect of his ...

  2. java线程的五大状态,阻塞状态详解

    一.状态简介 一个线程的生命周期里有五大状态,分别是: 新生 就绪 运行 死亡 运行后可能遇到的阻塞状态 二.相关方法 2.1 新生状态 Thread t = new Thread(); 正如我们前面 ...

  3. 关于MapReduce默认分区策略

    MapReduce默认分区策略 mapreduce 默认的分区方式是hashPartition,在这种分区方式下,KV对根据key的hashcode值与reduceTask个数进行取模,决定该键值对该 ...

  4. linux驱动之内核多线程(三)

    本文摘自 http://www.cnblogs.com/zhuyp1015/archive/2012/06/13/2548458.html 接上 一篇文章 ,这里介绍另一种线程间通信的方式:compl ...

  5. SparkStreaming-DStream(Discretized Stream)

    DStream(Discretized Stream)离散流 ◆ 和Spark基于RDD的概念很相似,Spark Streaming使用离散流 (discretized stream)作为抽象表示,叫 ...

  6. 大数据理论篇HDFS的基石——Google File System

    Google File System 但凡是要开始讲大数据的,都绕不开最初的Google三驾马车:Google File System(GFS), MapReduce,BigTable. 为这一切的基 ...

  7. go 多线程并发 queue demo

    原文链接:Writing worker queues, in Go 1.work.go [root@wangjq queue]# cat work.go package main import &qu ...

  8. 个人项目 源程序特征统计程序(C++)

    零.GitHub地址 https://github.com/King-Authur/Word-count 一.项目的相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这 ...

  9. 喵的Unity游戏开发之路 - 在球体上行走

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  10. [Window编程][VC6.0++][error LNK2001: unresolved external symbol __imp__PlaySoundA@12]

    错误情况 这几天看<Windows游戏编程大师技巧>,在看第三章的时候,把书上的例子敲了一边,但是出现了下述错误,最后在网上找到了解决方法. 错误截图 解决方法 在main.cpp头文件下 ...