在使用Autofac 的時候,我們註冊若干類別到容器中,而物件的生成也由容器幫我們處理;這時就需要探究一下,
究竟生成的物件是來自同一個參考,還是都是各自獨立的?這類的議題,牽扯到實際應
用時該使用哪種的生命週期註冊物件,並且物件會有我們預想要得表現。
首先直接說明註冊物件有主要三個生命週期
- InstancePerDependency :取得的物件每次都是新建立的(若沒設定此為預設值)
- InstancePerLifetimeScope:取得的物件在單一次request ,response 中都是同一個
- SingleInstance:應用程式運作時,取得的物件都是同一個。
參考前一次,除了保留Controller 的屬性注入之外,為了模擬三種的註所有機制會建立若干物件方便對照。
先針對三種機制建立對應的Interface 及Servcie,另額外建立 SettingService 物件內含所有對應物件。
InstancePerDependency 相關定義
InstancePerLifetimeScope 相關定義
SingleInstance 相關定義
SettingService 相關定義
全部類別定義完成,共7個
接下來是註冊的部分,個別將物件依照對應的生命週期註冊
此時來到Controller,設定屬性與印出相關物件的HashCode
觀察 Webapi 印出的值,發現PerLifetimeScope 及Singleton 的HashCode 值都一樣
若再增加一個Controller ,更能夠看出 PerLifetimeScope 及Singleton 的是否屬實
其中,PerDapendency 為物件每次都是新的所以 HashCode 都要不一樣,
再來 PerLifetimeScope 為同一次 request 中物件都是同一個,所以在 value 與 other Controller 中,
各自的HashCode 都是相同的;最後就是 Singleton 了,很明顯所有HashCode 的數值都一樣,
代表應用程式啟動時,第一次物件被建立後,之後取得就會都是同一個了。
對於三種不同生命週期的註冊機制,其對應的應用情境,覺得有下列幾種
- InstancePerDependency :工具類或只做簡易計算的任務,或很少用到的查詢任務
- InstancePerLifetimeScope:一般資料新刪修應用情境。
- SingleInstance:可應用於須建立長連線的情境,如Cache Server 的連線。
沒有留言:
張貼留言