AutoFac文档11(转载)
2024-10-19 15:39:21
目录
- 开始
- Registering components
- 控制范围和生命周期
- 用模块结构化Autofac
- xml配置
- 与.net集成
- 深入理解Autofac
- 指导
- 关于
- 词汇表
元数据
Autofac提供机制去创建和使用component的元数据
如果你熟悉Managed Extensibility Framework (MEF) ,你很可能已经见过component元数据的例子。
元数据是存储component中的关于这个component的信息,不需要创建实例也能访问。
在注册的时候添加元数据
值描述的元数据在注册阶段和component联系起来,每个元数据都是一个键值对:
1
2
3
|
builder.Register(c => new ScreenAppender()) .As<ILogAppender>() .WithMetadata( "AppenderName" , "screen" ); |
用XML文件可以表示为
1
2
3
4
5
6
7
|
<component type= "MyApp.Components.Logging.ScreenAppender, MyApp" service= "MyApp.Services.Logging.ILogAppender, MyApp" > <metadata> <item name= "AppenderName" value= "screen" type= "System.String" /> </metadata> </component> |
使用元数据
不用于一般的属性,元数据和component本身是相互独立额度。
这使得在运行条件下从很多component中选择一个时非常有用,或者元数据不是component实例的固有属性时。元数据可以表述ITask 执行的时间,或者实现了ICommand的按钮标题。
另外一些component可以使用通过Meta 使用元数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Log { readonly IEnumerable<Meta<ILogAppender>> _appenders; public Log(IEnumerable<Meta<ILogAppender>> appenders) { _appenders = appenders; } public void Write( string destination, string message) { var appender = _appenders.First(a => a.Metadata[ "AppenderName" ].Equals( destination)); appender.Value.Write(message); } } |
可以像下面那样通过使用 Meta<Lazy>或者the .NET 4 Lazy<T, TMetadata>,不创建component的也可以访问元数据。
强类型的元数据
为了防止使用字符串来描述元数据,可以为每条元数据指定一个可读的属性,通过继承IAppenderMetadata:
1
2
3
4
|
public interface IAppenderMetadata { string AppenderName { get ; } } |
在注册时,可以使用WithMetadata 的重载方法去关联值:
1
2
|
builder.Register(c => new ScreenAppender()) .As<ILogAppender>().WithMetadata<IAppenderMetadata>(m => m.For(am => am.AppenderName, "screen" )); |
(这里有一个更高级的例子)
在NET4.0中,autofac支持 Meta<T, TMetadata> 和System.Lazy<T, TMetadata> 冲强类型接口中读取值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Log { readonly IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> _appenders; public Log(IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> appenders) { _appenders = appenders; } public void Write( string destination, string message) { var appender = _appenders.First(a => a.Metadata.AppenderName == destination); appender.Value.Write(message); } } |
注意强类型属性AppenderName的使用
注册和使用元数据是分开的,所以你可以通过弱类型技术来使用强类型的元数据,反之亦然。
注意:Autofac1.4版本中, "extended properties"就是元数据,这个特征已经被元数据代替。
最新文章
- Linux查找命令
- ubuntu下安装加装DNS
- Chrome 控制台console的用法
- c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]
- viewpager中对fragment的操作
- Stop PeopleCode Processing with Error
- [转]Linux Ubuntu上架设FTP
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥
- Css实现一个简单的幻灯片效果页面
- js计算剩余分钟
- 常用的一些cmd命令
- Star HDU1541
- DevExpress中获取GridControl排序之后的List
- android上的默认Intent
- 【BZOJ1096】[ZJOI2007]仓库建设 斜率优化
- LeetCode初级算法的Python实现--数组
- Rabbitmq消息队列(二) Hello World! 模拟简单发送接收
- Java实现单例模式的两种方式
- 集训队日常训练20181117 DIV2
- 剑指Offer的学习笔记(C#篇)-- 二进制中1的个数
热门文章
- UVa 637 - Booklet Printing
- Git 报错:git - error: RPC failed; curl 18 transfer closed with outstanding read data remaining 解决方案
- c#封装三维向量,另外也看了下别人的C++封装
- client怎样调用IBinder接口对象
- 8个超有用的Java測试工具和框架
- (原创)2. WPF中的依赖属性之二
- Kotlin【简介】Android开发 配置 扩展
- drawable和values的加载规则
- java.lang.IllegalArgumentException:Document base ……does not exist or is not a readable directory错误的解决方案
- 【实践】require.js + r.js 代码打包压缩初体验