AutoFac文档11(转载)

目录

  1. 开始
  2. Registering components
  3. 控制范围和生命周期
  4. 用模块结构化Autofac
  5. xml配置
  6. 与.net集成
  7. 深入理解Autofac
  8. 指导
  9. 关于
  10. 词汇表

元数据

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

posted @ 2013-08-29 16:55  sandea  阅读(281)  评论(0编辑  收藏  举报