目录
- 开始
- 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"就是元数据,这个特征已经被元数据代替。