zoukankan      html  css  js  c++  java
  • [MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务

    一、演示概述
    此演示介绍了MEF如何使用ImportMany特性同时导入多个与相同约束相匹配的导出部件,并且介绍了目录服务(Catalog),该服务告知MEF框架可以在什么地方去搜寻与指定约束匹配的导出部件,即导出部件位于什么地方。
    相关下载(屏幕录像、代码)http://yunpan.cn/cVdN5JHeQrJgI  访问密码 065d
    温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM

    欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443


    二、多部件导入ImportMany
    部件的导出设置不做任何改变,将导入地方做类似如下的修改:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [ImportMany(typeof(ILogger))]  
    2. public IEnumerable<ILogger> Loggers { get; set; }  

    上述代码和单个部件的导入有两点区别:
    1、使用ImportMany特性,而不是Import特性。
    2、使用的是IEnumerable<T>类型来封装导入的部件。因为,导入的可能是多个部件,需要一种集合的方式来承载。

    导入元素做了如上的修改后,调用时只需要遍历即可访问每个导出部件。如下代码所示:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. static void Main(string[] args)  
    2. {  
    3.     Program program = new Program();  
    4.     program.Compose();  
    5.     foreach (ILogger logger in program.Loggers)  
    6.     {  
    7.         logger.WriteLog("Hello World!");  
    8.     }  
    9.     Console.ReadLine();  
    10. }  


    三、目录服务(Catalog)
    在MEF中,所谓的目录(Catalog)是不同于文件系统中的目录(Directory),而它的作用就是告知MEF框架可以在什么地方去查找导出部件,比如:
    AssemblyCatalog:在指定的程序集中查找导出部件。
    DirectoryCatalog:在指定的文件目录中查找导出部件,在构造函数中可传递文件目录,可以是绝对路径或相对路径。
    代码如下:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /// <summary>  
    2. /// 通过容器对象将宿主和部件组装到一起。  
    3. /// </summary>  
    4. public void Compose()  
    5. {  
    6.     AggregateCatalog aggregateCatalog = new AggregateCatalog();  
    7.     AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);  
    8.     DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");  
    9.     aggregateCatalog.Catalogs.Add(assemblyCatalog);  
    10.     aggregateCatalog.Catalogs.Add(directoryCatalog);  
    11.     var container = new CompositionContainer(aggregateCatalog);  
    12.     container.ComposeParts(this);  
    13. }  

    上述代码中有一个AggregateCatalog的目录类,这是一个聚合目录,它可以将多个目录组织在一起,比如上列中的AssemblyCatalog和DirectoryCatalog。这样,MEF就会在多个地方去搜寻匹配的导出部件。

    四、相关资源
    1、MSDN官方资料:http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx

  • 相关阅读:
    体验用yarp连接websocket
    从 ASP.NET Core 5.0 迁移到.NET 6
    对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。
    .NET6 WebAPI 自定义过滤器
    .NET6 WebApi 获取访问者IP地址
    .NET6 部署到 IIS
    .NET6 WebApi JSON传到前台默认变成小驼峰
    开发环境 测试环境 生产环境
    .NET6 WebApi 使用 log4net
    .NET6 WebApi 解决跨域问题
  • 原文地址:https://www.cnblogs.com/ExMan/p/5487216.html
Copyright © 2011-2022 走看看