目录

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

AutoFac文档11(转载)的更多相关文章

  1. AutoFac文档(转载)

    目录 开始 注册组件 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 开始 程序集 如果你正在使用Nuget包管理器,你可以通过 ...

  2. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  3. 使用swagger实现web api在线接口文档(转载)

    一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...

  4. ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...

  5. 如何从sun公司官网下载java API文档(转载)

    相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...

  6. AutoFac文档10(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 循环依赖 循环依赖是指 ...

  7. AutoFac文档3(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 服务类型,名称和键 同 ...

  8. AutoFac文档14(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 激活事件 在compo ...

  9. AutoFac文档13(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 属性注入 属性注入使用 ...

随机推荐

  1. mysql字符串比较

    select '123'B is TRUE;  1 SET @a='123';            select '123'is TRUE;      0 select cast('222' as ...

  2. 【iOS开发-图层】图层的获取与一些属性

    图层 每个控件都有自己的一个图层,这个空间的全部东西就是显示在这个图层上面的,控件本身没有显示东西的功能,仅仅有拥有了图层才干显示东西 图层的获取 CALayer *layer = self.test ...

  3. C# 通过HttpWebRequest在后台对WebService进行调用

    通过HttpWebRequest在后台对WebService进行调用 http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.ht ...

  4. 使MySQL对表名不区分大小写

    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区 ...

  5. 通过 WCF 实现点对点文件共享 z

    下载免费的项目源代码 下载项目的数据库 目录 简介 背景 为什么是WCF? WCF历史简述 WCF基础 点对点概念 代码分析(它是怎么工作的) 核心转化引擎层 下载管理层 服务层 代码的使用(如何运行 ...

  6. 斯坦福大学卷积神经网络教程UFLDL Tutorial - Convolutional Neural Network

    Convolutional Neural Network Overview A Convolutional Neural Network (CNN) is comprised of one or mo ...

  7. Python学习(三)流程控制

    Python流程控制 本章介绍 python 的基础流程控制.包括 if 条件语句.for 循环 和 while 循环语句: continue 及 break 的用法等. 基本用法与 C 和 Java ...

  8. iOS开源项目:AwesomeMenu

    https://github.com/levey/AwesomeMenu 模仿Path的menu,使用CoreAnimation实现. 1.首先说使用 AwesomeMenuItem *starMen ...

  9. java中常量定义在interface中好还是定义在class中

    Java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量,除此之外单独定义一个cl ...

  10. C++构造函数、析构函数、虚析构函数

    1.构造函数 C++中的构造函数是用于初始化类的各种变量以及分配资源等.主要的注意事项是: (1)在继承关系中先初始化父类对象后初始化子类对象. (2)在一个类中按照变量的声明顺序,对类中的变量进行初 ...