天天看點

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();      

看一下結果:

Autofac - 事件

額, 首先我得說明一下, 輸出的順序和我寫事件的順序是沒有關系的, 不是說, 我事件寫在前面, 輸出就在前面. 從這張圖上, 能看到, 對象建立時, 構造函數的調用時在中間的.

其實, 按照通常了解, 我覺得, 構造函數的調用應該是在 OnActivating 事件之後的. 但是這裡跑到前面去了, 也不知道是不是我的dll有問題啊

既然有這個疑問, 但是又找不到答案, 那就隻好自己去看源碼了.

先看看OnActivating做了什麼

Autofac - 事件

這個方法, 就是注冊事件, 将handler注冊到RegistrationData的ActivatingHandlers的集合中.

Autofac - 事件

在Excute(上一篇貼過)方法裡面, 有一個Activate方法. 方法如下:

Autofac - 事件

這個方法裡面, 已經可以看到幾個事件的執行順序了, 更加具體的源碼, 我就不貼了, 代碼有點多, 有興趣的童鞋可以自己去瞧一下

這裡有一點值的注意, 我這裡用的是無參的構造函數, 如果是有參的構造函數, 而參數是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文檔