当前位置:网站首页>[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务
[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务
2022-08-08 20:55:00 【光脚丫思考】
一、演示概述
此演示介绍了MEF如何使用ImportMany特性同时导入多个与相同约束相匹配的导出部件,并且介绍了目录服务(Catalog),该服务告知MEF框架可以在什么地方去搜寻与指定约束匹配的导出部件,即导出部件位于什么地方。
相关下载(屏幕录像、代码): http://yunpan.cn/cVdN5JHeQrJgI 访问密码 065d
温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected]
欢迎有兴趣研究.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就会在多个地方去搜寻匹配的导出部件。 四、相关资源
1、MSDN官方资料: http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx
边栏推荐
猜你喜欢
随机推荐
Swoole 健康检查
究竟什么才是“云计算” | 科普好文
Kotlin annotations
基于opencv的实时睡意检测系统
Flask 教程 第十章:邮件支持
安装sentry
Kotlin注解
Kotlin's JSON format parsing
mysql8设置远程连接
C#实现Everything——数据显示
语义分割FCN FPN UNet DeepLab HRNet SETR TransFuse...
SQL注入之搭建dnslog
deepin系统入门记录
Gradle is as simple as using kotlin to write common commands
Educational Codeforces Round 112 D. Say No to Palindromes
Protobuf框架与WebAPI
Kotlin实用的一些框架
目标检测论文 Precise detection of Chinese characters in historical documents with DRL
单片机--IIC总线篇
Notes: The difference between laravel, updateOrCreate and updateOrInsert









