目录

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

最新文章

  1. Linux查找命令
  2. ubuntu下安装加装DNS
  3. Chrome 控制台console的用法
  4. c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]
  5. viewpager中对fragment的操作
  6. Stop PeopleCode Processing with Error
  7. [转]Linux Ubuntu上架设FTP
  8. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥
  9. Css实现一个简单的幻灯片效果页面
  10. js计算剩余分钟
  11. 常用的一些cmd命令
  12. Star HDU1541
  13. DevExpress中获取GridControl排序之后的List
  14. android上的默认Intent
  15. 【BZOJ1096】[ZJOI2007]仓库建设 斜率优化
  16. LeetCode初级算法的Python实现--数组
  17. Rabbitmq消息队列(二) Hello World! 模拟简单发送接收
  18. Java实现单例模式的两种方式
  19. 集训队日常训练20181117 DIV2
  20. 剑指Offer的学习笔记(C#篇)-- 二进制中1的个数

热门文章

  1. UVa 637 - Booklet Printing
  2. Git 报错:git - error: RPC failed; curl 18 transfer closed with outstanding read data remaining 解决方案
  3. c#封装三维向量,另外也看了下别人的C++封装
  4. client怎样调用IBinder接口对象
  5. 8个超有用的Java測试工具和框架
  6. (原创)2. WPF中的依赖属性之二
  7. Kotlin【简介】Android开发 配置 扩展
  8. drawable和values的加载规则
  9. java.lang.IllegalArgumentException:Document base ……does not exist or is not a readable directory错误的解决方案
  10. 【实践】require.js + r.js 代码打包压缩初体验