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 组件、服务、自动装配 《第二篇》

Autofac文档

以上是关于Autofac - 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用事件侦听器来加载动画片段的循环

.NET Core Autofac 4.0的配置和使用示例代码

Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入

autofac v4.0+通过配置文件的方式注册组件

Autofac使用代码方式进行组件注册不需要依赖

浅析依赖注入框架Autofac的使用