Autofac - 事件
Posted Sniper_ZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Autofac - 事件相关的知识,希望对你有一定的参考价值。
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 - 事件的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core Autofac 4.0的配置和使用示例代码