Autofac在提供之前那些方法的时候, 同时提供了五个事件, 这一篇就看一下这几个事件.

一、五大事件

builder.RegisterType<Person>().As<IPerson>()
.OnRegistered(r => Console.WriteLine("OnRegistered"))
.OnPreparing(r => Console.WriteLine("OnPreparing"))
.OnActivating(r => Console.WriteLine("OnActivating"))
.OnActivated(r => Console.WriteLine("OnActivated"))
.OnRelease(r => Console.WriteLine("OnRelease")); Console.WriteLine("---------------");
var container = builder.Build();
Console.WriteLine("----------------------");
var person = container.Resolve<IPerson>();
Console.WriteLine("--------------------------------");
person.Self();

看一下结果:

额, 首先我得说明一下, 输出的顺序和我写事件的顺序是没有关系的, 不是说, 我事件写在前面, 输出就在前面. 从这张图上, 能看到, 对象创建时, 构造函数的调用时在中间的.

其实, 按照通常理解, 我觉得, 构造函数的调用应该是在 OnActivating 事件之后的. 但是这里跑到前面去了, 也不知道是不是我的dll有问题啊

既然有这个疑问, 但是又找不到答案, 那就只好自己去看源码了.

先看看OnActivating做了什么

这个方法, 就是注册事件, 将handler注册到RegistrationData的ActivatingHandlers的集合中.

在Excute(上一篇贴过)方法里面, 有一个Activate方法. 方法如下:

这个方法里面, 已经可以看到几个事件的执行顺序了, 更加具体的源码, 我就不贴了, 代码有点多, 有兴趣的童鞋可以自己去瞧一下

这里有一点值的注意, 我这里用的是无参的构造函数, 如果是有参的构造函数, 而参数是IAnimal和IGo呢, 那么IAnimal和IGo的OnActivating方法, 就会在IPerson的构造函数之前执行.

builder.RegisterType<Dog>().As<IAnimal>()
.OnActivating(r => Console.WriteLine("IAnimal - OnActivating"))
.OnActivated(r => Console.WriteLine("IAnimal - OnActivated"))
.OnRelease(r => Console.WriteLine("IAnimal - OnRelease"))
.OnRegistered(r => Console.WriteLine("IAnimal - OnRegistered"))
.OnPreparing(r => Console.WriteLine("IAnimal - OnPreparing"));
builder.RegisterType<Go>().As<IGo>()
.OnActivating(r => Console.WriteLine("IGo + OnActivating"))
.OnActivated(r => Console.WriteLine("IGo + OnActivated"))
.OnRelease(r => Console.WriteLine("IGo + OnRelease"))
.OnRegistered(r => Console.WriteLine("IGo + OnRegistered"))
.OnPreparing(r => Console.WriteLine("IGo + OnPreparing"));
builder.RegisterType<Person>().As<IPerson>()
.OnActivating(r => Console.WriteLine("IPerson | OnActivating"))
.OnActivated(r => Console.WriteLine("IPerson | OnActivated"))
.OnRelease(r => Console.WriteLine("IPerson | OnRelease"))
.OnRegistered(r => Console.WriteLine("IPerson | OnRegistered"))
.OnPreparing(r => Console.WriteLine("IPerson | OnPreparing")); Console.WriteLine("---------------");
var container = builder.Build();
Console.WriteLine("----------------------");
var person = container.Resolve<IPerson>();
Console.WriteLine("--------------------------------");
person.Self();

现在来看, 整个执行顺序就很明显了

参考:

Autofac 组件、服务、自动装配 《第二篇》

Autofac文档

Autofac - 事件的更多相关文章

  1. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  2. .Net 事件总线之Autofac解耦

    事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线基础知识,核心点放置使用Aut ...

  3. Autofac之生命周期和事件

    Autofac为注册的类型对象提供了一套生命周期事件,覆盖了一个类型从注册到最后“释放”的一套事件.有了这些事件,我们可以相对方便的在类型对象的各个阶段进行AOP操作. builder.Registe ...

  4. Autofac解耦事件总线

    事件总线之Autofac解耦 事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线 ...

  5. AutoFac使用方法总结二:事件与依赖循环

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

  6. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  7. Autofac 依赖注入

    介绍 Autofac是一款IOC框架,很轻量级性能非常高,自动注入很给力. NuGet Autofac:Autofac控制反转容器核心 Autofac.MVC5:提供IDependencyResolv ...

  8. C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理

    在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...

  9. 从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简的实现前后台ajax表格展示及分页实现

    本来是想试着做一个简单OA项目玩玩的,真是不做不知道,一做吓死人,原来以为很简单的事情,但是做起来不是忘这就是忘那的,有的技术还得重新温习.所以还是得记录.免得哪天电脑挂了,就全没有了. 开始是看了园 ...

随机推荐

  1. Remote Desktop Connection Manager

    通过Remote Desktop Connection Manager(RDCMan),当前最新版本是 v2.7. 通过这款软件,我们便可以轻松的管理和访问数个RDP.左边的列表中我们可以创建总的分区 ...

  2. 避免Castle Windsor引起的内存泄露

    原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...

  3. Java多线程7:死锁

    前言 死锁单独写一篇文章是因为这是一个很严重的.必须要引起重视的问题.这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只 ...

  4. maven仓库信息分析站点推荐

    maven是java的一个依赖,打包管理的工具,稍微大一点的java项目都需要使用maven. 随着java的壮大,maven仓库越来越大,仓库中的jar包有60多万,各种group,各种构件,各种版 ...

  5. Gamma函数是如何被发现的?

    学过微积分的人,肯定都接触过Euler积分,按教科书上的说法,这是两种含有参变量的定积分,但其实没那么玄乎,它们只是两个函数.其中第一型Euler积分叫\(B\)-函数,第二型Euler积分叫\(\G ...

  6. iOS-技巧性总结

    1.AFN与ASI对比 -- AFN1. 基于 NSURLConnection & NSURLSession 进行的封装2. 使用简单3. 提供了自动的序列化 & 反序列化支持! AF ...

  7. java基础-多线程执行

    package Thanqi; public class TestApple implements Runnable{ //苹果的数量 private int count = 5; //拿苹果 //s ...

  8. 视图必须派生自 WebViewPage 或 WebViewPage<TModel>

    后端汇总:http://www.cnblogs.com/dunitian/p/4523006.html#efmvc 后来发现原来吧web.config给删了 这就简单了,复制其他项目的web.conf ...

  9. LINQ系列:Linq to Object生成操作符

    生成操作符从现有序列值中创建新的序列. 1. Empty  Empty操作符返回一个指定类型的空集. 1>. 原型定义 public static IEnumerable<TResult& ...

  10. OpenCASCADE General Transformation

    OpenCASCADE General Transformation eryar@163.com Abstract. OpenCASCADE provides a general transforma ...