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();
現在來看, 整個執行順序就很明顯了
參考: