AutoFac文档11(转载)
目录
- 开始
- 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"就是元数据,这个特征已经被元数据代替。
AutoFac文档11(转载)的更多相关文章
- AutoFac文档(转载)
目录 开始 注册组件 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 开始 程序集 如果你正在使用Nuget包管理器,你可以通过 ...
- ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/ 谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...
- 使用swagger实现web api在线接口文档(转载)
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
- 如何从sun公司官网下载java API文档(转载)
相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...
- AutoFac文档10(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 循环依赖 循环依赖是指 ...
- AutoFac文档3(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 服务类型,名称和键 同 ...
- AutoFac文档14(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 激活事件 在compo ...
- AutoFac文档13(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 属性注入 属性注入使用 ...
随机推荐
- mysql字符串比较
select '123'B is TRUE; 1 SET @a='123'; select '123'is TRUE; 0 select cast('222' as ...
- 【iOS开发-图层】图层的获取与一些属性
图层 每个控件都有自己的一个图层,这个空间的全部东西就是显示在这个图层上面的,控件本身没有显示东西的功能,仅仅有拥有了图层才干显示东西 图层的获取 CALayer *layer = self.test ...
- C# 通过HttpWebRequest在后台对WebService进行调用
通过HttpWebRequest在后台对WebService进行调用 http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.ht ...
- 使MySQL对表名不区分大小写
今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区 ...
- 通过 WCF 实现点对点文件共享 z
下载免费的项目源代码 下载项目的数据库 目录 简介 背景 为什么是WCF? WCF历史简述 WCF基础 点对点概念 代码分析(它是怎么工作的) 核心转化引擎层 下载管理层 服务层 代码的使用(如何运行 ...
- 斯坦福大学卷积神经网络教程UFLDL Tutorial - Convolutional Neural Network
Convolutional Neural Network Overview A Convolutional Neural Network (CNN) is comprised of one or mo ...
- Python学习(三)流程控制
Python流程控制 本章介绍 python 的基础流程控制.包括 if 条件语句.for 循环 和 while 循环语句: continue 及 break 的用法等. 基本用法与 C 和 Java ...
- iOS开源项目:AwesomeMenu
https://github.com/levey/AwesomeMenu 模仿Path的menu,使用CoreAnimation实现. 1.首先说使用 AwesomeMenuItem *starMen ...
- java中常量定义在interface中好还是定义在class中
Java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量,除此之外单独定义一个cl ...
- C++构造函数、析构函数、虚析构函数
1.构造函数 C++中的构造函数是用于初始化类的各种变量以及分配资源等.主要的注意事项是: (1)在继承关系中先初始化父类对象后初始化子类对象. (2)在一个类中按照变量的声明顺序,对类中的变量进行初 ...