zoukankan      html  css  js  c++  java
  • MEF核心笔记(2)Catalog的种类

    一、内容回顾

    清明时节雨纷纷啊,本打算回趟老家的,后来想想还是算了,人多,又下雨。闲话不多说了,上一篇中,我们了解了一些基本概念,如Export、Import、Catalog等,本篇就Catalog,进行更加深入的讲解。

    二、框架中的Catalog

    在MEF框架中,包含了4种Catalog,所有的Catalog的是从System.ComponentModel.Composition.Primitives名称空间下的ComposablePartCatalog抽象类派生下来。

    继承层次结构

    • AssemblyCatalog:表示从程序集中搜索部件的目录。
    • DirectoryCatalog:表示从文件系统的指定路径中,搜索程序集,从而搜索部件。
    • TypeCatalog:表示从指定的类型集合中,去搜索相应的部件。
    • AggregateCatalog:聚合目录,可以添加上面所说的所有目录,从而进行多方面的部件搜索。

    三、自定义Catalog

    虽然MEF提供了4种Catalog已经能满足我们很多需求,但也并非所有时候都尽如人意。如果无法满足,我们可以通过自定义Catalog来完成我们所需要的部件搜索。

    自定义Catalog和系统实现的Catalog类似,我们通过继承System.ComponentModel.Composition.Primitives空间下的ComposablePartCatalog类,并且覆写掉基类的方法即可。

    image

    上图是ComposablePartCatalog类中提供的方法,我们要实现自己的Catalog,必须要覆写掉Parts属性,如有特别需要处理的,我们还可以覆写GetExports方法,此方法默认的调用了Parts属性,进行进一步的输出。

    四、综合示例

    本次的示例依然很简单,我们通过使用MEF提供的四种Catalog,来获取Part,并且将获取到的Part类型输出到控制台中。解决方案如下:

    image

    其中MEFParts为一个类库项目,并且生成输出路径是在MEFApplication输出路径下的Parts目录中,两个项目的Classes文件中,我们都是很简单的定义了没有任何实现的类,然后输出了object(即Export(typeof(object))),本次示例的Contract是object。

    Classes中定义如下:

    namespace MEFParts {
    
        [Export(typeof(object))]
        public class Class1 {
    
        }
    
        [Export(typeof(object))]
        public class Class2 {
    
        }
    
        [Export(typeof(object))]
        public class Class3 {
    
        }
    }

    Program中,我们输出了所有的Part,代码如下:

    namespace MEFApplication {
        class Program {
    
            private static MEF.CompositionContainer _container;
    
            static void Main(string[] args) {
    
                var assemblyCatalog = new MEF.AssemblyCatalog(typeof(Program).Assembly);
                var directoryCatalog = new MEF.DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "\\Parts", "*.dll");
                var typeCatalog = new MEF.TypeCatalog(typeof(Class6), typeof(Class7));
                var aggregateCatalog = new MEF.AggregateCatalog(assemblyCatalog, directoryCatalog, typeCatalog);
    
                _container = new MEF.CompositionContainer(aggregateCatalog);
    
                var exports = _container.GetExports<object>();
                foreach (var exportValue in exports) {
                    Console.WriteLine(exportValue.Value.GetType());
                }
    
    
                Console.ReadLine();
            }
        }
    }

    其中:using MEF = System.ComponentModel.Composition.Hosting;

    五、总结

    本篇文章的内容依然很简单,虽然简单,但这是MEF中很核心的东西,所以单独提出来。现在,我们熟悉了Catalog了,下一篇,我们开始说Export、Import。另外说一下,这系列的文章都是针对.NET Framework 4.0中自带的,因为目前Codeplex上的MEF框架已经更新了很多内容,难免有所不同,这里只作为参考吧,毕竟只是学习笔记嘛!

    源码下载(访问密码:d121)

    作者:Sun.M
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    优化cocos2d/x程序的内存使用和程序大小
    cocos2d-x移植:xcode到eclipse
    程序员在编程工作中痛苦的压抑着自己某些强烈的情绪
    C++语言的一些问题
    基数排序-图非常清晰明了
    【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
    《C++ Primer》笔记-inline内联函数
    走出你的舒适区
    UDP广播与多播
    测试问题反馈需要包含内容总结
  • 原文地址:https://www.cnblogs.com/prinsun/p/3001614.html
Copyright © 2011-2022 走看看