MEF 编程指南(六):导出和元数据
声明导出解释了部件导出服务的基础知识和价值观(Values)。有时候出于种种原因,导出关联信息是非常必要的。通常,用于解释关于功能公共契约的具体实现。允许导入满足约束要求的导出,或者导入所有可用的实现并且在导出前在运行时检查他们的功能。
- [Export(typeof(IMessageSender))]
- [ExportMetadata("transport", "smtp")]
- public class EmailSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- [Export(typeof(IMessageSender))]
- [ExportMetadata("transport", "smtp")]
- [ExportMetadata("secure", null)]
- public class SecureEmailSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- [Export(typeof(IMessageSender))]
- [ExportMetadata("transport", "phone_network")]
- public class SMSSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- public interface IMessageSender
- {
- void Send(string message);
- }
- [MetadataAttribute]
- [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
- public class MessageSenderAttribute : ExportAttribute
- {
- public MessageSenderAttribute() : base(typeof(IMessageSender)) { }
- public MessageTransport Transport { get; set; }
- public bool IsSecure { get; set; }
- }
- public enum MessageTransport
- {
- Undefined,
- Smtp,
- PhoneNetwork,
- Other
- }
- public interface IMessageSender
- {
- void Send(string message);
- }
- [MessageSender(Transport=MessageTransport.Smtp)]
- public class EmailSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- [MessageSender(Transport=MessageTransport.Smtp, IsSecure=true)]
- public class SecureEmailSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- [MessageSender(Transport=MessageTransport.PhoneNetwork)]
- public class SMSSender : IMessageSender
- {
- public void Send(string message)
- {
- Console.WriteLine(message);
- }
- }
- public interface IMessageSenderCapabilities
- {
- MessageTransport Transport { get; }
- bool IsSecure { get; }
- }
- public class HttpServerHealthMonitor
- {
- [ImportMany]
- public Lazy<IMessageSender, IMessageSenderCapabilities>[] Senders { get; set; }
- public void SendNotification()
- {
- Compose();
- foreach (var sender in Senders)
- {
- if (sender.Metadata.Transport == MessageTransport.Smtp && sender.Metadata.IsSecure)
- {
- var messageSender = sender.Value;
- messageSender.Send("Server is fine");
- break;
- }
- }
- }
- private void Compose()
- {
- //var container = new CompositionContainer();
- //container.ComposeParts(this, new EmailSender());
- AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
- var container = new CompositionContainer(catalog);
- container.ComposeParts(this);
- }
- }
- public class HttpServerHealthMonitor
- {
- [ImportMany]
- public Lazy<IMessageSender, IDictionary<string, object>>[] Senders { get; set; }
- public void SendNotification()
- {
- Compose();
- foreach (var sender in Senders)
- {
- if (sender.Metadata.ContainsKey("Transport"))
- {
- var messageSender = sender.Value;
- messageSender.Send("Server is fine");
- }
- }
- }
- private void Compose()
- {
- //var container = new CompositionContainer();
- //container.ComposeParts(this, new EmailSender());
- AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
- var container = new CompositionContainer(catalog);
- container.ComposeParts(this);
- }
- }
- public interface IMessageSenderCapabilities
- {
- MessageTransport Transport { get; }
- [DefaultValue(false)]
- bool IsSecure { get; }
- }
MEF 编程指南(六):导出和元数据的更多相关文章
- MEF 编程指南(二):定义可组合部件和契约
可组合部件(Composable Parts) 在 MEF 内部可组合部件是一个可组合单元.可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务.在 MEF 编程模型中,可组合部件 ...
- MEF 编程指南(九):部件生命周期
理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports) 共 ...
- MEF 编程指南(五):延迟导出
在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求.对于有些应用程序,推迟实例化 - 并且防止递归组合图(Recursive Composition Down ...
- MEF 编程指南(三):声明导出
组合部件通过 [System.ComponentModel.Composition.ExportAttribute] 特性声明导出.MEF 有几种不同的方式声明导出,包括在部件层面(Part Leve ...
- MEF 编程指南(七):使用目录
目录(Catalogs) MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF ...
- MEF 编程指南(十二):批量组合
MEF 容器实例并非不可变的.如果目录支持改变(像监控目录变动)或者在运行时添加/移除部件都可能发生改变.以前,你不得不做出改动并且调用 CompositionContainer 上的 Compose ...
- MEF 编程指南(十一):查询 CompositionContainer
CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载. 在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明. 当请求单一实例的时候,如果没发 ...
- MEF 编程指南(八):过滤目录
当使用子容器的时候,基于特定的标准(Specific Criteria)过滤目录是很必要的.比如,基于部件构造策略的过滤器是很常见的.下面的代码片段演示了如何构建的特殊途径(Particular Ap ...
- MEF 编程指南(四):声明导入
组合部件通过 [System.ComponentModel.Composition.ImportAttribute] 特性声明导入.类似于导出,也有几种不同的方法声明导入,即通过:字段(Fields) ...
随机推荐
- OK335xS 网络连接打印信息 hacking
/*********************************************************************** * OK335xS 网络连接打印信息 hacking ...
- 【C#学习笔记】窗口隐藏、最小化、最大化、正常化
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- zoj 2027 Travelling Fee
// 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ...
- 【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值
[题目链接:NYOJ-119] 思路:转自 点我 ,讲的挺好. #include <cstdio> #include <math.h> #define max(a,b) ((a ...
- 实时通讯库 libre/librem/restund/baresip
http://www.creytiv.com/ 源码下载 libre Toolkit library for asynchronous network IO with protocol stacks ...
- [Everyday Mathematics]20150117
设 $f:\bbR^{n\times n}\to\bbR$ 适合 $$\bex f(cA+B)=cf(A)+f(B),\quad f(AB)=f(BA),\quad\forall\ c\in\bbR, ...
- ORACLE临时表总结[转]
临时表概念 临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别.它只能存储在临时表空间,而非用户的表空间.ORACLE临时表是会话或事务级别的,只对 ...
- Ubuntu中使用pyUSB读取鼠标或键盘的数据程序
参考 :http://www.orangecoat.com/how-to/read-and-decode-data-from-your-mouse-using-this-pyusb-hack 要注意的 ...
- ACM竞赛 Java编程小结
1.字符串的长度 String str = new String(" abcd"); int length = str.length(); 2.数组的长度.排序 2.1对于 a[] ...
- homework03
代码实现真的是大问题……在第二次作业还没有真正实现的情况下只能写这么一篇博客来整理一下从各位大神那里看到的东西. 两个弱菜加起来同样是弱菜,所以我和我的小伙伴的配合就是悲剧的聚合. 首先,大家都说C# ...