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. linux下git以及github的连接与使用

    简单理解 Git 的思想和基本的工作原理,能够更好的进一步和使用Git.在开始学习Git 的时候,最好不要把Git的各种概念和其他的版本控制系统诸如 Subversion 等相比,否则容易混淆每个操作 ...

  2. SQL Server2016 原生支持JSON

    SQL Server2016 原生支持JSON SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML 索引以及各种管理 XML 或输出 XML 格式的函数. ...

  3. UI控件(UIButton)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // UIButtonTypeCustom = 0, ...

  4. Spring Rabbitmq HelloWorld实例

    之前的博客和大家分享了Rabbitmq的基本框架,及其工作原理,网址为 < http://www.cnblogs.com/jun-ma/p/4840869.html >.今天呢,想和大家一 ...

  5. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  6. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  7. 纯命令行的编辑利器:用好 awk 与 sed

    awk 的基本语法 awk 是模式查找与处理语言,是文本处理的利器.使用 awk 可以只用一条简单的命令完成复杂的文本数据处理. awk 命令的基本结构为: awk '模式 {处理}' 文件 比如,打 ...

  8. MySQL实现嵌套集合模型

    MySQL实现嵌套集合模型 译文主要是介绍如何用MySQL来存储嵌套集合数据.在其中会增加一些自己的理解,也会删除掉一些自认为无用的废话. 这篇文章主要讲的是嵌套集合模型,所以邻接表不是本文的重点,简 ...

  9. ASP.NET MVC 5 - 开始MVC5之旅

    本教程将使用Visual Studio 2013手把手教你构建一个入门的ASP.NET MVC5 Web应用程序.本教程配套的C#源码工程可通过如下网址下载:C#版本源码链接.同时,请查阅 Build ...

  10. [ASP.NET MVC 小牛之路]06 - 使用 Entity Framework

    在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码中手工造的数据.本文将演示如何在ASP.NET MVC中使用E ...