zoukankan      html  css  js  c++  java
  • 关于MEF

    MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基于MEF构建的。

    MEF组合过程

    1.创建组件目录(如AssemblyCatalog)

    2.创建组合容器CompositionContainer

    3.创建一个组件

    4.从组件容器获取其它组件功能定义,执行匹配组合

    var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); //创建一个程序集目录,用于从一个程序集获取所有的组件定义   
    var container = new CompositionContainer(catalog); //创建组合容器   
    var composablePart = new MyComponent();   
    container.ComposeParts(composablePart); //=获取ExportDefinition并创建实例组合在一起 

    上面代码有一个问题,如果程序集过大,会导致速度很慢,毕竟会搜索程序集,所以可以改为下面这种方式来实现:

    下面基于一个具体事例:

    TypeCatalog cat = new TypeCatalog(typeof(IRepository<T_JSSDD_DDZB_SXPZ>),
                    typeof(IRepository<T_JSSDD_DDZB_SBXM>),
                    typeof(IRepository<T_JSSDD_DDZB_SXPZVALUE>), typeof(IRepository<T_JSSDD_DDZB_XM_R_SX>));
                //如果程序集比较小的话,可以使用AssemblyCatalog来初始化组合容器,程序集如果比较大,那么由于反射查找整个程序集
                //所以性能上很差,建议使用上面TypeCatalog来初始化组合容器
                AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
                var container = new CompositionContainer(cat);
                container.ComposeParts(this,
                    new T_JSSDD_DDZB_SBXMRepository(),
                    new T_JSSDD_DDZB_SXPZRepository(),
                    new T_JSSDD_DDZB_XM_R_SXRepository(),
                    new T_JSSDD_DDZB_SXPZVALUERepository()
                    );

    直接传入接口和类进行映射和其他IOC容器用法类似,速度会快很多,缺点就是灵活性少了。

    贴点简单事例代码吧,看下用法,具体的机制大家慢慢研究吧,MEF基于net framework 4.0,不用引入第三方类库,使用也是挺方便的:

    /// <summary>
        /// 导出特性
        /// </summary>
        [Export(typeof(ICal1))]
        public class Class1 : ICal1
        {
            public void C()
            {
                Console.WriteLine("实现二");
            }
        }
    
    /// <summary>
        /// 导出特性
        /// </summary>
        [Export(typeof(ICalculator))]
        public class MySimpleCalculator : ICalculator
        {
            public string Calculate(string input)
            {
                Console.WriteLine("已经实现的方法");
                return null;
            }
        }
    
    
     public class Container
        {
            /// <summary>
            /// 导入
            /// </summary>
            [Import(typeof(ICalculator))]
            public ICalculator ICalculator { get; set; }
            /// <summary>
            /// 导入特性
            /// </summary>
            [Import(typeof(ICal1))]
            public ICal1 ICal1 { get; set; }
    
            //初始化容器
            public Container()
            {
                AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
                var container = new CompositionContainer(catalog);
                container.ComposeParts(this,new MySimpleCalculator(), new Class1());
            }
    
    
        }
    
          static void Main(string[] args)
            {
                Container container = new Container();
                Console.WriteLine("Enter Command:");
                container.ICal1.C();
                Console.WriteLine(container.ICalculator.Calculate(""));
                Console.Read();
            }
  • 相关阅读:
    番外篇:生产要素最适投入分析(Optimum input of factors)
    docker 9 :镜像存储机制
    docker 8 : 容器资源限制管理
    docker 7 :docker基本操作
    docker 6:容器之间共享磁盘
    docker 5 :挂载的方式
    docker 4 : 容器数据卷使用
    docker 3:创建镜像
    docker 2:Docker镜像增删改查
    docker 1:Docker安装(CentOS8.0)
  • 原文地址:https://www.cnblogs.com/Johnzhang/p/3593349.html
Copyright © 2011-2022 走看看