zoukankan      html  css  js  c++  java
  • C# ------ MEF

    参考

    参考

    MEF全称Managed Extensibility Framework, 是一个用于创建可扩展的轻型应用程序的库。开发人员可以利用MEF发现并使用扩展,但并不需要配置,而且还可以在应用程序之间重用扩展。应用程序的扩展是一个大型应用程序架构师必须考虑的一个问题。以前的解决办法通常是用配置文件,接口及反射技术来进行实现。而MEF则 提供一种通过隐式发现组件的方法。MEF 组件以声明方式同时指定其依赖项(称为“导入”)及其提供的功能(称为“导出”)。MEF 是 .NET Framework 4 的组成部分,早期的 .NET Framework 版本引入了 Managed Add-in Framework (MAF),旨在使应用程序能够隔离和管理扩展。 MAF 的重点放在比 MEF 稍高的级别,它集中于扩展隔离以及程序集的加载和卸载,而 MEF 则集中于可发现性、扩展性和可移植性。 这两个框架可以顺利地进行互操作,并且单个应用程序可以同时利用这两个框架。

    本文简单的测试一下MEF,
    首先新建一个控制台工程.并添加MEF框架的引用,既 System.ComponentModel.Composition.dll,然后键入如下代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MEFDemo
    {
        class Program
        {
            //导入对象使用
            [Import("chinese_hello")]
            public Person oPerson { set; get; }
    
            [Import("TestProperty")]
            public string ConsoleTest { get; set; }
    
            [Import("ActionTest")]
            public Action<string> TestActionImport { set; get; }
    
            [Import("FuncTest")]
            public Func<string> TestFuncImport { set; get; }
    
            [Import("FuncTestvalue")]
            public Func<string,string> TestFuncImport2 { set; get; }
            //多参数
           // public Func<string, string,string> TestFuncImport2 { set; get; }
            static void Main(string[] args)
            {
                var oProgram = new Program();
                oProgram.MyComposePart();
    #if false
                //测试一
                var strRes = oProgram.oPerson.SayHello("李磊");
                Console.WriteLine(strRes);
               
    #endif
    #if true
                ////测试二
                oProgram.TestActionImport("Jim");//无返回值
                var a = oProgram.TestFuncImport();//有返回值
                var b = oProgram.TestFuncImport2("可以传参");//可以传参有返回值
                //Console.WriteLine(a);
                Console.WriteLine(b);
    #endif
                Console.Read();
            }
            //宿主MEF并组合部件
            void MyComposePart()
            {
                //Assembly.GetExecutingAssembly():当前方法所在程序集
                //Assembly.GetCallingAssembly():调用当前方法的方法 所在的程序集
                var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
                var container = new CompositionContainer(catalog);
                //将部件(part)和宿主程序添加到组合容器
                container.ComposeParts(this);
            }
        }
        public class TestPropertyImport
        {
            [Export("TestProperty")]
            public string TestMmport { get { return "测试属性可以导入导出"; } }
    
            [Export("ActionTest", typeof(Action<string>))]
            public void TestAction(string name)
            {
                Console.WriteLine("Hello:" + name);
            }
    
            [Export("FuncTest", typeof(Func<string>))]
            public string  TestFunc()
            {
                return "Hello:" + "1111";
            }
            [Export("FuncTestvalue", typeof(Func<string,string>))]
            public string TestFuncValue(string name)
            {
                return "Hello:" + name;
            }
        }
        //声明对象可以导出
        [Export("chinese_hello", typeof(Person))]
        public class Chinese : Person
        {
            public string SayHello(string name)
            {
                return "你好:" + name;
            }
        }
        [Export("american_hello", typeof(Person))]
        public class American : Person
        {
            public string SayHello(string name)
            {
                return "Hello:" + name;
            }
        }
        public interface Person
        {
            string SayHello(string name);
        }
    }
  • 相关阅读:
    普通父类和抽象父类
    properties文件的读取和写入
    HTTPS接口获取数据报错的问题
    SpringMVC中bean之间的相互应用(循环引用)
    JAVA代码进行排序以及模糊查询
    从TXT读取文本和将数据写入TXT文本的两种方式
    EXCEL最简洁导出(不带样式设置)
    5种线程池的创建方法和作用
    html5是什么
    J2EE,JSP,Java的区别
  • 原文地址:https://www.cnblogs.com/macT/p/11290535.html
Copyright © 2011-2022 走看看