首页 > 代码库 > Autofac - 事件
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 - 事件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。