• MEF


    MEF

    从接触MEF到现在,已经有些年头了,虽然有些年头,但一直未在实际项目中使用,这可能是因为它的Framework框架太高,毕竟目前公司的主流项目都是用Framework 3.5。如此,冷落了它,有点可惜。最近可能会需要用到了,所以写一些笔记,来让自己熟悉起来。

    题外话说一下,最近公司的小组里面一位成员要离开了,小组中也就我和他有对领域驱动设计有所研究,还没好好合作一次呢,也真是可惜。的确,这世间就是有太多的可惜,也许,哪天不如意了,我也会离开。当然,这一切都是题外话,偶尔的伤感和牢骚后,我们应该继续向前看,毕竟,向前看脖子才不酸(相比起仰视)。

    废话不多说了,下面,我们进入正题吧。

    一、基本概念

    • MEF:Managed Extensibility Framework,.NET 4.0中带来的一个基于托管的扩展程序开发框架(挺拗口的,不过只是概念),另外通过强大的百度百科,我们发现MEF还是“小鼠胚胎成纤维细胞”的简称(这货是?)。
    • Contract:契约,即一种约定,具体在代码中表现为接口和抽象类。自从进入.NET 4.0,契约这个单词我们应该不会陌生,WCF中贯穿着各种契约,无论如何,契约就是一种约定。
    • Import:导入,导入契约的实现,说明此处需要一个实现的契约。
    • Export:导出,导出契约的实现,说明相应的类中实现了相应的契约。
    • Part:部件,即实现契约的类。
    • Catalog:目录(我是这样定义的),存放部件的地方,当需要某个部件时,会在目录中寻找。
    • Container:容器,存放目录并进行部件管理,如导出、导入等。
    • Compose:组装,通过容器在目录中寻找到实现了相应契约的部件,进行部件的组装。

    二、框架图示

    绘图1

    不是很会作图,上面的图就将就着看吧。一个Component Import了两个Contract,分别是Contract 1和Contract 2,一个Catalog中有两个Part并且Export了上诉的两个Contract,最后,Component通过Container的Compose操作,实例化了两个Contract。(我表述的不是很好,说的很拗口,但MEF是非常简单的框架,坚持看下去,你一定会学会的)

    三、基本使用示例

    下面到了动手操作的时候了,打开Visual Studio,新建一个.NET 4的控制台项目【MyMEFApplication】,添加对MEF库的引用,即“System.ComponentModel.Composition”。

    1、添加一个契约

    //这便是我们的契约 Contract
    public interface ICalculator {
    
        int Add(int a, int b);
    
        int Sub(int a, int b);
    }

    2、实现这个契约

    //此处我们导出了契约,这就是一个部件
       [Export(typeof(ICalculator))]
       public class MyCalculator : ICalculator {
    
           public int Add(int a, int b) {
               Console.WriteLine("Add Invoked");
               return a + b;
           }
    
           public int Sub(int a, int b) {
               Console.WriteLine("Sub Invoked");
               return a - b;
           }
       }

    3、完成测试程序

    class Program {
    
        private static CompositionContainer _container;
    
        static void Main(string[] args) {
            //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索
            var catalog = new AssemblyCatalog(typeof(Program).Assembly);
            _container = new CompositionContainer(catalog);
    
            MathCompute mathCompute = new MathCompute();
            _container.ComposeParts(mathCompute);//组装部件
    
            Console.WriteLine(mathCompute.Add(1, 3));
            Console.WriteLine(mathCompute.Sub(3, 2));
    
            Console.ReadLine();
        }
    }
    
    public class MathCompute {
    
        //我们需要导入这个契约实现的部件
        [Import(typeof(ICalculator))]
        private ICalculator _calculator;
    
    
        public int Add(int a, int b) {
            return _calculator.Add(a, b);
        }
    
        public int Sub(int a, int b) {
            return _calculator.Sub(a, b);
        }
    
    }

    由于时间仓促,本次示例相当简单,并且无实际意义,接下来的实例,我会尽量弄些有实际意义的东西。

    四、总结

    本篇笔记中,我们大致的了解了MEF的使用,并且完成了一个很无聊的应用程序。我们熟知了什么是导入、导出,什么是契约、容器,这样就够了。

    源码下载(请点击)

    作者:Sun.M
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
     
     

    随笔分类 -C#

    MEF核心笔记(6)让 MEF 拥抱 AOP

    2014-04-13 22:39 by Sun.M, 571 visits, 网摘收藏编辑
    摘要: 距离上一篇日志到今天,已经快有一年的间隔时间了。这一年多的时间里,发生了太多的事情,我从一个单身汉,变成如今拥有一对双胞胎儿子的老爹。上天的对我的眷顾总是让我措手不及,无论是压力还是动力,总还是需要积极面对的。闲话就说到这里,本来上一篇应该为MEF系列的结尾,但还是有很多东西需要记录下,于是有了这一篇。阅读全文

    MEF核心笔记(5)是模式还是设计

    2013-04-18 22:12 by Sun.M, 1150 visits, 网摘收藏编辑
    摘要: 最近事情很多,有烦恼,有悲伤,不过,一切想通后,感觉其实也没什么。毕竟,这是每个人都要经历了,那么恭喜自己,就要当爸爸了,一个程序员爸爸。 所以,好久没写博客了,今天,我们继续来说MEF,这也是MEF的最后一篇博文。 阅读全文

    MEF核心笔记(4)细说MEF中的Attribute [下]

    2013-04-09 21:29 by Sun.M, 537 visits, 网摘收藏编辑
    摘要: 今天,我们继续MEF的学习记录,这次内容感觉比较重要,所以,特别放到单独一篇来说,这也是MEF很有特色的地方,相信这其中的亮点,会让你感触良多的。 本篇主要有以下几节内容: 部件的创建规则 元数据和元数据视图 部件组装通知 总结 一、部件的创建规则 我们知道,在目前主流的IoC框架里,注入对象的创建都可以进行个性化配置,例如是否以单例方式创建(也就是共享一个对象,给所有需要注入的地方调用)...阅读全文

    MEF核心笔记(3)细说MEF中的Attribute [上]

    2013-04-06 17:25 by Sun.M, 560 visits, 网摘收藏编辑
    摘要: 又到了写笔记的时候了,这次的内容网罗了MEF中的所有Attribute,感觉内容偏多,所以分为两个篇幅来记录,篇幅内容过多的话,感觉不太适合阅读。 本篇记录包括以下内容: 基本导入导出(ExportAttribute、ImportAttribute) 导入导出的种类(ImportingConstructorAttribute、ImportManyAttribute) 导入和导出的继承(In...阅读全文

    MEF核心笔记(2)Catalog的种类

    2013-04-05 21:47 by Sun.M, 597 visits, 网摘收藏编辑
    摘要: 一、内容回顾 清明时节雨纷纷啊,本打算回趟老家的,后来想想还是算了,人多,又下雨。闲话不多说了,上一篇中,我们了解了一些基本概念,如Export、Import、Catalog等,本篇就Catalog,进行更加深入的讲解。 二、框架中的Catalog 在MEF框架中,包含了4种Catalog,所有的Catalog的是从System.ComponentModel.Composition.Prim...阅读全文

    MEF核心笔记(1)基础应用

    2013-04-04 23:04 by Sun.M, 571 visits, 网摘收藏编辑
    摘要: 从接触MEF到现在,已经有些年头了,虽然有些年头,但一直未在实际项目中使用,这可能是因为它的Framework框架太高,毕竟目前公司的主流项目都是用Framework 3.5。如此,冷落了它,有点可惜。最近可能会需要用到了,所以写一些笔记,来让自己熟悉起来。 题外话说一下,最近公司的小组里面一位成员要离开了,小组中也就我和他有对领域驱动设计有所研究,还没好好合作一次呢,也真是可惜。的确,这世间就...阅读全文

    携手Delphi,保护我们的.NET程序

    2013-03-23 15:43 by Sun.M, 3559 visits, 网摘收藏编辑
    摘要: 大家都知道,对于用.NET开发的应用程序而言,是很容易被反编译的。如果我们的应用程序中有一些比较隐秘的东西(如注册算法),我们是很不希望被其它人知道的,所以我们需要保护自己写的.NET程序。 目前保护.NET应用程序主要还是靠混淆,并且也不乏一些很强大的混淆软件,本文主要是从另外一个方向下手,基于文件的保护,而不是代码层面的。 话不多说,我们从实际操作开始,边操作我会边解释为什么是基于文件的保...阅读全文

    c# 调用金蝶登录,并解析PropsString

    2012-08-13 16:39 by Sun.M, 122 visits, 网摘收藏编辑
    摘要: 金蝶的登录界面,主要是COM技术,在.NET4.0之前,我们使用Reflection来调用,而.NET4.0之后,我们可以使用Dynamic特性来调用了。以下是使用.NET2.0来实现的,没有什么好说的,直接上代码,代码就是最好的说明,以下是我封装的一个类: using System;using System.Collections.Generic;using System.Text;using...阅读全文

    c# 文字组合文字

    2012-08-13 16:13 by Sun.M, 94 visits, 网摘收藏编辑
    摘要: 这个标题很不好起,什么叫文字组合文字?通过下图就明白了: 可以看到,这个M是由很多“*”组成,这就是文字组合文字。 其实思路很简单,就是通过将需要产生的组合文字,先绘制到一个Bitmap中,然后通过判断Bitmap像素来组合我们需要的文字。请看以下很简略的代码: private Bitmap ConvertCharToBitmap(char c) { Bitma...阅读全文
     
    分类: C#
  • 相关阅读:
    复杂分组查询 查询订单数量和订单总金额 根据国家分组
    left join 连接之后 where条件字段为空 解决办法
    virtual Box 搭建 centOS 步骤(优化卡顿设置)(卡、卡、卡)
    Redis学习Redis的应用场景
    C#设计模式2创建型模式2.4 抽象工厂模式(Abstract Factory Pattern)
    Redis学习Redis的高频面试题
    Redis学习.AspNet Core项目实际应用
    C#设计模式2创建型模式2.5 建造者模式(Builder Pattern)
    C#设计模式2创建型模式2.2简单工厂模式(Factory Method Pattern)
    C#设计模式2创建型模式2.6原型模式(Prototype Pattern)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3665050.html
Copyright © 2020-2023  润新知