博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoFac文档11(转载)
阅读量:7282 次
发布时间:2019-06-30

本文共 2260 字,大约阅读时间需要 7 分钟。

目录

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

转载于:https://www.cnblogs.com/sandea/p/3289930.html

你可能感兴趣的文章
NGUI3.x Button事件
查看>>
FFmpeg 官方 20160227 之后 追加 libmfx 无法在 xp 上运行的解决方法
查看>>
多线程的使用注意点
查看>>
【GitHub】README.md文件中 markdown语法 插入超链接
查看>>
移动着,心就变了
查看>>
2014冬去春来
查看>>
Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例
查看>>
基本概念
查看>>
《Linux内核设计与实现》读书笔记(10)--- 定时器和时间管理(2)
查看>>
Spark On YARN内存分配
查看>>
Python学习笔记【第十三篇】:Python网络编程一Socket基础
查看>>
Hibernate ORM框架——项目一:Hibernate查询;项目二:集合相关查询
查看>>
Ionic2开发环境搭建
查看>>
ccf 最优灌溉
查看>>
(30)批处理文件.bat
查看>>
基于MFC和opencv的FFT
查看>>
0823模拟赛
查看>>
Ajax
查看>>
HDU 1849 Rabbit and Grass 【Nim博弈】
查看>>
JMeter-Java压力测试工具-01
查看>>