首页 > 其他分享 >[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务

[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务

时间:2023-06-29 13:35:54浏览次数:39  
标签:MEF ImportMany 04 导出 部件 导入 new



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


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


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

[ImportMany(typeof(ILogger))]
public IEnumerable<ILogger> Loggers { get; set; }

上述代码和单个部件的导入有两点区别:


1、使用ImportMany特性,而不是Import特性。


2、使用的是IEnumerable<T>类型来封装导入的部件。因为,导入的可能是多个部件,需要一种集合的方式来承载。



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


static void Main(string[] args)
{
    Program program = new Program();
    program.Compose();
    foreach (ILogger logger in program.Loggers)
    {
        logger.WriteLog("Hello World!");
    }
    Console.ReadLine();
}



三、目录服务(Catalog)


在MEF中,所谓的目录(Catalog)是不同于文件系统中的目录(Directory),而它的作用就是告知MEF框架可以在什么地方去查找导出部件,比如:


AssemblyCatalog:在指定的程序集中查找导出部件。


DirectoryCatalog:在指定的文件目录中查找导出部件,在构造函数中可传递文件目录,可以是绝对路径或相对路径。


代码如下:


/// <summary>
/// 通过容器对象将宿主和部件组装到一起。
/// </summary>
public void Compose()
{
    AggregateCatalog aggregateCatalog = new AggregateCatalog();
    AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
    DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");
    aggregateCatalog.Catalogs.Add(assemblyCatalog);
    aggregateCatalog.Catalogs.Add(directoryCatalog);
    var container = new CompositionContainer(aggregateCatalog);
    container.ComposeParts(this);
}

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






标签:MEF,ImportMany,04,导出,部件,导入,new
From: https://blog.51cto.com/u_3319687/6581487

相关文章

  • 04-ES6语法:默认参数和rest参数
    本文我们分别介绍ES6中的默认参数和rest参数,下面我们分别进行说明和演示。下面是简单的屏幕分享,不爱看文字的同道中人可以看视频。-_-一、默认参数首先,我们先看看在ES5中是如何定义默认参数的方式,代码如下://ES5的默认参数值。functioncreateBox(width,height,color){......
  • package-lock.json锁定镜像地址404的处理方法
    前言最近接触了一个新的vue项目,安装依赖是一直无法安装成功,有部分依赖包的地址报404,查看package-lock.json,发现其中部分依赖使用了公司私有的镜像库,但是目前该镜像库已关闭,访问该包地址返回404.解决方案如下1、删除package-lock.json,重新npmi生成新的package-lock.json2、先卸......
  • hdu 2604(矩阵快速幂)
    题意:f和m两种字母,给出l表示有2^l个由f和m组成长度为l的字符串,如果这些字符串内包含fmf或fff子串的是一种特殊字符串,给出l问不是特殊字符串的数量是多少。题解:先暴力把前几个l的答案跑了一下,发现有个规律f(n)=f(n-1)+f(n-3)+f(n-4),试着用这个公式写了矩阵快速幂交上去......
  • WP CTF-Web 攻防世界 GFSJ0475 get_post
    「场景」进入场景后提示请用GET方式提交一个名为a,值为1的变量「思路」根据提示在url后加上?a=1,回车发送请求。出现新提示。请再以POST方式随便提交一个名为b,值为2的变量打开brupsuite,配置本地代理为brupsuite中proxy的地址和端口号,刷新浏览器页面,brupsuite捕获到请求......
  • WP CTF-Web 攻防世界 GFSJ0474 view_source
    「场景」题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。「思路」进入场景,右键无法使用,按F12,打开开发者工具,切换到ELements标签页,发现flag...「工具」「知识拓展」......
  • MySqlException(0x80004005) Reading from the stream has failed 远程主机强迫关闭了
    不同客户端电脑连接服务器数据库,通过navicat管理工具可以正常连上,但是通过程序连接提示MySqlException(0x80004005)Readingfromthestreamhasfailed远程主机强迫关闭了一个现有的连接(注意:部分电脑通过程序也是可以正常连接服务器数据库的)解决方法:服务器重新安装Micr......
  • 在EasyCVR中调用快照接口返回404是什么原因?如何解决?
    EasyCVR视频融合平台基于云边端一体化架构,能在复杂的网络环境中将前端设备进行统一集中接入,实现视频资源的汇聚管理、直播鉴权、转码处理、多端分发、智能告警、数据共享等能力与服务。此外,平台也提供了丰富的API接口供用户自由调用、集成与二次开发。有用户反馈,在EasyCVR中调用......
  • 【JVM 方法区 04】
    从线程共享与否的角度划分“运行时数据区结构图”  线程共享区包括:堆、方法区(元空间)他两都会报OOM,现成私有化包括:虚拟机栈、本地方法栈、程序计数器(其中虚拟机栈和本地方法栈会抛StackOverflowError异常,程序计数器不会抛异常),还有一部分叫ThreadLocal一、栈、堆、方法区的交......
  • http 301、302、304、400、405、415状态码解释
     301movedpermanently、302found、303seeother301/302/303都表示重定向,所以放在一起讲解。301表示永久重定向(301movedpermanently),表示请求的资源分配了新url,以后应使用新url。302表示临时性重定向(302found),请求的资源临时分配了新url,本次请求暂且使用新url。302与301的区别......
  • 11-gorm-V2-04-高级查询
    @目录1.用Struct或Map接收数据1.1Find到Struct1.2Find到Map2.子查询3.Group/Having3.1Group完整示例3.2Having4.变量4.1使用sql.Named定义4.2使用map定义变量5.用Rows()迭代6.查钩子7.Pluck(单列查询)8.Scopes(调用查询函数)8.1使用8.2示例9.Count1.用Struct或Map......