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文檔