zoukankan      html  css  js  c++  java
  • MEF核心笔记(1)基础应用

    从接触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的使用,并且完成了一个很无聊的应用程序。我们熟知了什么是导入、导出,什么是契约、容器,这样就够了。

    源码下载(访问密码:80fb)

    作者:Sun.M
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    SpringBoot+ElementUI实现通用文件下载请求(全流程图文详细教程)
    Java中将String格式的标准时间字符串转换为Date格式的方法
    ElementUI中el-upload传递额外参数为date类型时后台SpringBoot接收不到
    模式、框架、架构和平台的区别
    架构、框架、模式和平台
    “模式”与“方式”的区别
    JAVA发送HTTP请求方式
    http status状态码,readyState状态码
    区分网络请求时http和ajax请求
    HTTP请求方式中8种请求方法
  • 原文地址:https://www.cnblogs.com/prinsun/p/3000266.html
Copyright © 2011-2022 走看看