文章出處

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()