AutoFac使用方法总结:Part II
事件
AutoFac支持三种事件:OnActivating,OnActivated,OnRelease。OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他的初始化工作,OnActivated在实例化之后会被调用,OnRelease在组件释放之后会被调用。
public class MyEvent : IDisposable
{
public MyEvent(string input)
{
Console.WriteLine(input);
} public MyEvent()
{
Console.WriteLine("Init");
} public void Dispose()
{
Console.WriteLine("Dispose");
}
}
public void test_event()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyEvent>().
OnActivating(e => e.ReplaceInstance(new MyEvent("input"))).
OnActivated(e => Console.WriteLine("OnActivated")).
OnRelease(e => Console.WriteLine("OnRelease")); using (IContainer container = builder.Build())
{
using (var myEvent = container.Resolve<MyEvent>())
{
}
}
}
此时的输出为:
Init
input
OnActivated
Dispose
OnRelease
利用事件可以在构造对象之后调用对象的方法:
[Fact]
public void call_method_when_init()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyClassWithMethod>().OnActivating(e => e.Instance.Add());
IContainer container = builder.Build();
Assert.Equal(, container.Resolve<MyClassWithMethod>().Index);
}
public class MyClassWithMethod
{
public int Index { get; set; }
public void Add(int value)
{
Index = Index + value;
}
}
循环依赖
循环依赖是个比较头疼的问题,在AutoFac中很多循环依赖的场景不被支持:
public class ClassA
{
private readonly ClassB b; public ClassA(ClassB b)
{
this.b = b;
}
} public class ClassB
{
public ClassA A { get; set; } } [Fact]
public void circular_dependencies_exception()
{
var builder = new ContainerBuilder();
builder.Register(c => new ClassB(){A = c.Resolve<ClassA>()});
builder.Register(c => new ClassA(c.Resolve<ClassB>()));
IContainer container = builder.Build();
Assert.Throws(typeof(DependencyResolutionException), ()=>container.Resolve<ClassA>());
}
可以部分的解决这种循环依赖的问题,前提是ClassA和ClassB的生命周期不能都是InstancePerDependency
[Fact]
public void circular_dependencies_ok()
{
var builder = new ContainerBuilder();
builder.RegisterType<ClassB>().
PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).SingleInstance();
builder.Register(c => new ClassA(c.Resolve<ClassB>()));
IContainer container = builder.Build();
Assert.NotNull(container.Resolve<ClassA>());
Assert.NotNull(container.Resolve<ClassB>());
Assert.NotNull(container.Resolve<ClassB>().A);
}
AutoFac使用方法总结:Part II的更多相关文章
- [转][C#]AutoFac 使用方法总结
AutoFac使用方法总结:Part I 转自:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ AutoFac是.net平台下 ...
- AutoFac使用方法总结:Part I
注册部分 使用RegisterType进行注册 [Fact] public void can_resolve_myclass() { var builder = new ContainerBuilde ...
- AutoFac使用方法总结
AutoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系.在使用方面主要是register和resolve两类操作. 这篇文章用单元测试的形式列举了AutoFac的常用使用方法 ...
- AutoFac使用方法总结四:生命周期续
控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转. 依赖注入(DI/Depende ...
- AutoFac使用方法总结二:事件与依赖循环
事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他 ...
- AutoFac使用方法总结一:注册
AutoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系.在使用方面主要是register和resolve两类操作. 这篇文章用单元测试的形式列举了AutoFac的常用使用方法 ...
- AutoFac使用方法总结:Part III
生命周期 AutoFac中的生命周期概念非常重要,AutoFac也提供了强大的生命周期管理的能力. AutoFac定义了三种生命周期: Per Dependency Single Instance P ...
- AutoFac使用方法总结三:生命周期
生命周期 AutoFac中的生命周期概念非常重要,AutoFac也提供了强大的生命周期管理的能力. AutoFac定义了三种生命周期: Per Dependency Single I ...
- AutoFac Ioc依赖注入容器
本文原著:牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图: 没有使用IOC容器的情况 ...
随机推荐
- AVOS_百度百科
AVOS_百度百科 AVOS 目录 公司产品 AVOS 是 YouTube 创始人 Chad Hurley 和 Steve Chen(陈士骏)创立的互联网公司. 编辑本段公司产品 产品包括 ...
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...
- Fitnesse使用系列二
决策表 Fitnesse中提供了好几种表格样式,前面说了.表格是运行測试的关键.从字面看.表格描写叙述的是測试用例.从运行角度看,表格为后端的代码(fitnesse里称作fixture)提供了包名.类 ...
- Python学习笔记22:Django下载并安装
Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...
- ThinkPHP的连贯操作方法中field方法
ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model ...
- Centos 6安装完美搭建mysql、php、apache之旅
安装apache [root@centos share]# yum -y install httpd Loaded plugins: fastestmirror, refresh-packagekit ...
- Amazon S3数据一致性模型
左右Amazon S3有两种类型的数据的一致性模型的: 最后,一致性和读一致性. 有下面几种行为: 1 写一个新的object,然后開始读它.直到全部的变化都传播完(副本),你才干读到它,否则就是ke ...
- Redis 安装与简单示例(转)
本文转载自:http://www.cnblogs.com/kissdodog/p/3570984.html Redis的安装 Redis下载地址如下:https://github.com/dmajki ...
- linux yum命令
1 安装yum install 全部安装yum install package1 安装指定的安装包package1yum groupinsall group1 安装程序组group1 2 更新和升级y ...
- elf 文件格式探秘——程序运行背后的故事
摘要:本文主要讲解elf文件格式,通过readelf命令结合底层的相关数据结构,讲解相关内容,分析程序运行的基本原理. 本文来源:elf 文件格式探秘——程序运行背后的故事 http://blog.c ...