zoukankan      html  css  js  c++  java
  • MEF入门之不求甚解,但力求简单能讲明白(二)

    在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法。

    但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法。

    本篇,我们逐渐往简单的文件管理器的目标靠拢。

    新建类库IPart,添加一个接口IFileHandler.cs

    namespace IPart
    {
        public interface IFileHandler
        {
            void Process();
        }
    }

    Parts类库和主项目meftest均引用IPart

    Parts类库中,将要导出的类型改为IFileHandler,类实现IFileHandler

    以其中一个为例。

    using IPart;
    using System;
    using System.ComponentModel.Composition;
    
    namespace Parts
    {
        [Export(typeof(IFileHandler))]//表示此类需要导出,导出的类型为IFileHandler
        public class TxtFileHandler: IFileHandler
        {
           public void Process()
            {
                Console.WriteLine("处理文本文件");
            }
        }
    }

    主项目:

    using IPart;
    using System;
    using System.ComponentModel.Composition.Hosting;
    
    namespace meftest
    {
        class Program
        {
            //容器,装东西用的。具体装什么先不管。
            private static CompositionContainer container;
            static void Main(string[] args)
            {
                //AssemblyCatalog 目录的一种,表示在程序集中搜索
                var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)
                //在某个目录下的dll中搜索。
                var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");
                var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);
    
                //创建搜索到的部件,放到容器中。
                container = new CompositionContainer(aggregateCatalog);        
                var exports = container.GetExports<IFileHandler>();//获得所有导出的部件(IFileHandler类型的)。
                foreach (var item in exports)
                {
                    item.Value.Process();//此处已经可以调用IFileHandler.Process()了
                }
                Console.ReadLine();
            }
        }
    }

    编译后,别忘了把Parts.dll拷贝到主程序的bindebug下。

    运行:

    我们已经把所有IHandler类型的实例创建出来了,并且运行了其中的成员函数。

     最恨天下文章一大抄,请不要转载。

  • 相关阅读:
    天气查看
    省市区三级联动
    AJAX动态加载评论
    jquery插件实现分页
    obj-fit
    js使用正则表达式验证身份证格式
    弹性图片
    浏览器兼容问题
    Python3基础 __getattr__ 访问不存在的属性时,新增提示功能
    Python3基础 __delattr__ 在一个属性被删除时的行为
  • 原文地址:https://www.cnblogs.com/luhuanong/p/5540290.html
Copyright © 2011-2022 走看看