MEF初体验之十一:查询组合容器
2014-04-17 21:19
246 查看
查询组合容器
组合容器暴露了几个get exports的重载方法和导出对象和对象集合。你需要注意下面的行为:
当请求单个对象实例时,如果未发现导出,一个异常将被抛出
当请求单个对象实例时,如果发现超过一个,一个异常将被抛出
GetExportedValue方法
在下面的代码片段中,我们请求一个Root(契约)实例的对象var container = new CompositionContainer(new AssemblyCatalog(typeof(Program).Assembly)); Root partInstance = container.GetExportedValue<Root>();
如果你在一个不同的契约名字下有一个导出,你将需要使用一个不同的重载:
[Export("my_contract_name")] public class Root { } var container = new CompositionContainer(new AssemblyCatalog(typeof(Program).Assembly)); Root partInstance = container.GetExportedValue<Root>("my_contract_name");
GetExport方法
GetExport方法检索Export的一个Lazy的实例引用。访问export的Value属性将促使导出实例被创建。导出值的连续调用将返回相同的对象,而不管部件是否有一个共享/非共享的生命周期。Lazy<Root> export = container.GetExport<Root>(); var root = export.Value; //create the instance.
GetExportedValueOrDefault方法
GetExportedValueOrDefault方法恰好GetExportedValue方法一样工作,不同的是在没有匹配情况下它不会抛出一个异常。var root = container.GetExportedValueOrDefault<Root>(); // may return null
最后仍然举个例子:
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QueryingCompositionContainer { class Program { [Import] public IMessageSender Sender { get; set; } static void Main(string[] args) { Program p = new Program(); p.Run(); Console.ReadKey(); } void Run() { var catalog = new AssemblyCatalog(typeof(Program).Assembly); var container = new CompositionContainer(catalog); container.ComposeParts(this); IMessageSender s = container.GetExportedValue<IMessageSender>(); Console.WriteLine(s == Sender); IMessageSender s2 = container.GetExportedValueOrDefault<EmailSender>(); if(s2 == null) Console.WriteLine("Exported EmailSender is null"); Lazy<IMessageSender> s3 = container.GetExport<IMessageSender>(); var s3_1 = s3.Value; var s3_2 = s3.Value; Console.WriteLine(s3_1 == s3_2);//True,Lazy<T>特性 Console.WriteLine(s3_1 == Sender); } } interface IMessageSender { void Send(string msg); } [Export(typeof(IMessageSender))] class EmailSender : IMessageSender { public void Send(string msg) { Console.WriteLine("Email sent:" + msg); } } }
输出如图:
相关文章推荐
- 我学MEF系列(4):组合容器(CompositionContainer)和目录(Catalog)
- MEF初体验之二:定义组合部件和契约
- NET 自带IOC容器MEF指初体验
- MEF 编程指南(十一):查询 CompositionContainer
- MEF应用(4) 组合容器 目录
- MEF学习系列(4): 组合容器(CompositionContainer)和目录(Catalog)
- 机房重构--组合查询
- 机房收费系统之组合查询:基本字符串拼接方法和存储过程实现
- 组合查询的实现
- Elasticsearch判断多列存在、bool条件组合查询示例
- 机房之组合查询2
- Entity Framework 的多条件组合查询和 LIKE 查询(Combination search and simulate LIKE search with Entity Framework
- (六)组合查询—机房收费系统
- MEF: MSDN 杂志上的文章(3) 组合
- 021 分区组合条件分页查询 - bos
- c++——容器实现文本查询程序
- 【机房收费系统】 之 组合查询
- 数据库之组合查询
- 重构—组合查询
- 如何进行ibatis动态多条件组合查询以及模糊查询