事件

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);
}

转载链接:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test-2/

AutoFac使用方法总结二:事件与依赖循环的更多相关文章

  1. jquery事件重复绑定的几种解决方法 (二)

    防止事件重复绑定共有4种方法: bind().unbind()方法 live().die()方法 off().on()方法 one()方法 一.bind().unbind()方法 bind();绑定事 ...

  2. ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

    在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...

  3. Spring官网阅读(二)(依赖注入及方法注入)

    上篇文章我们学习了官网中的1.2,1.3两小节,主要是涉及了容器,以及Spring实例化对象的一些知识.这篇文章我们继续学习Spring官网,主要是针对1.4小节,主要涉及到Spring的依赖注入.虽 ...

  4. AutoFac使用方法总结:Part II

    事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他的初始化工 ...

  5. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  6. 从入门到放弃,.net构建博客系统(二):依赖注入

    文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...

  7. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  8. vue-cli+webpack在生成的项目中使用bootstrap方法(二)

    vue-cli+webpack在生成的项目中使用bootstrap方法(一)中,是通过手动下载bootstrap库,然后手动添加到src/assets中,显然是过程太多. 当然是可以更省力些,可以通过 ...

  9. [转][C#]AutoFac 使用方法总结

    AutoFac使用方法总结:Part I 转自:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ AutoFac是.net平台下 ...

随机推荐

  1. Python3.5 学习八 附加知识点 paramiko和rsa非对称秘钥的适用

    关于paramiko: SSH SFTP 机器上没有安装该模块,只是初步了解了下,没有细细研究. 可能以后只有做运维的才能用到的吧 利用秘钥,在ssh中不输入用户名密码进行登录 利用秘钥进行FTP操作 ...

  2. python 带参与不带参装饰器的使用与流程分析/什么是装饰器/装饰器使用注意事项

    一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技 ...

  3. MySQL(视图、触发器、函数)

    day61 参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html 视图 视图:给某个查询语句设置别名,日后方便使用               ...

  4. 五,mysql优化——sql语句优化小技巧

    1,大批量插入数据 (1)对于MyISAM: alter table table_name disable keys; loading data; alter table table_name ena ...

  5. Java自学路线

    万事开头难,学习Java亦是如此.而在学习的开始,选择正确的学习路线更是尤为重要.在本文中我将分享本人自学转行路上的学习路线,希望能给想自学,却不知道方向的同学带来帮助~ 1 .JavaSE 基础 这 ...

  6. 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分

    特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...

  7. RabbitMQ : 几种Exchange 模式

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...

  8. hive算法报错..

    hive普通语句查询报错.. 查到以下设定项,,附加在语句前执行成功.. 但是有可能没有真正的执行.. 试到最后使用标红的三行附加在语法前执行成功 set hive.execution.engine= ...

  9. Java之Socket网络编程实践

    转自:http://my.oschina.net/leejun2005/blog/104955#comments 一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准 ...

  10. wordpress常用标记

    博客地址:bloginfo('url'); 博客名称:bloginfo("name"); 博客描述:bloginfo("decription"); 文章内容: ...