原文鏈接:http://docs.autofac.org/en/latest/lifetime/index.html Lifetime 是指服務的實例在程式中存活多久 – 從最初的實例化到清理(disposal)。例如,一個實現 IDisposable 的對象,它的生命周期就是從實例化時開始,持續到 ...
原文鏈接:http://docs.autofac.org/en/latest/lifetime/index.html
Lifetime 是指服務的實例在程式中存活多久 – 從最初的實例化到清理(disposal)。例如,一個實現 IDisposable 的對象,它的生命周期就是從實例化時開始,持續到調用它的 Dispose 時結束。(未主動調用 Disopose 則持續到被GC收集時)。
Scope 是指程式中的一塊區域,在此區域內,服務可以被使用它的組件共用。例如,程式中全局的靜態的單例對象,它的範圍是整個程式。而在for迴圈里創建的本地變數,它的範圍就要小的多。
Autofac 中的生命周期範圍(lifetime scope)組合了這兩個概念。實際上,可以把生命周期範圍與應用程式中的工作單元等同起來。在工作單元的開始時創建生命周期範圍,工作單元需要的服務從這個生命周期範圍解析獲得。解析服務時,Autofac 會跟蹤實現 IDisposable 介面的組件。在工作單元結束時,清理(Dispose)生命周期範圍,實現 IDisposable 介面的組件會同時被清理。
生命周期範圍控制共用和清理:
- 生命周期範圍是可嵌套的,這控制組件如何被共用。例如,單例服務可以從根生命周期範圍解析,而其他服務,則由各個工作單元請求自己的實例,在註冊組件時,可以通過設置實例範圍指定組件如何被共用。
- 生命周期範圍跟蹤實現 IDisposable 介面的對象,這些對象隨生命周期範圍一起被清理。服務的使用者不需要瞭解底層實現。
編寫程式時,瞭解這些概念有助於有效使用資源。
應始終從生命周期範圍解析服務,而不是從根容器解析,這一點非常重要。由於生命周期範圍對 IDisposable 處理方式,如果從容器(根生命周期範圍)解析 IDisposable 對象,則可能不小心導致記憶體泄露。在根容器被清理前,它將一直持有對 IDisposable 對象的引用。
以下是一個具體的 web 示例,假設有以下場景:
- 程式中有一個全局的單例日誌服務。
- 兩個請求同時到達。
- 每個請求是一個邏輯上的“工作單元”,需要各自獨立的訂單處理服務。
- 每個訂單處理服務都需要使用日誌服務來打日誌。
在這個場景中,根生命周期範圍(容器)包含單例日誌服務,每個請求對應一個子生命周期範圍, 包含各自的訂單處理服務:
+---------------------------------------------------+ | Autofac Container | | Root Lifetime Scope | | | | Logging Service | | (shared across all requests) | | | | +----------------------+ +----------------------+ | | | First Request Scope | | Second Request Scope | | | | | | | | | | Order Processor | | Order Processor | | | +----------------------+ +----------------------+ | +---------------------------------------------------+
請求結束時,訂單處理服務將隨生命周期範圍一同被清理。而日誌服務是單例服務,將繼續存活,供後續的請求使用。