autofac 作用域_控制作用域和生命周期
控制作用域和生命周期?
這個有一篇學習Autofac控制作用域和生命周期很好的文章 Nick Blumhardt's Autofac lifetime primer. 里面有很多東西可以學習, 并且有很多混合的概念, 因此我們嘗試在這邊對該文做些補充.
回憶下 注冊章節 , 你向容器中添加了一個實現 服務 的 組件 . 最后 解析服務 并且使用這些服務的實例來完成一些事.
服務的 生命周期 是指服務實例在你的應用中存在的時長 - 從開始實例化到最后 釋放 結束. 例如, 如果你 "new up" 了一個 實現 IDisposable 的對象并且之后調用了它的 Dispose() 方法, 對象的生命周期是從你實例化一直到釋放 (或者是被垃圾回收, 如果你沒有提前釋放它的話).
服務的 作用域 是指它在應用中能共享給其他組件并被消費的作用域. 例如, 在你的應用中你有個全局的靜態單例 - 該全局對象實例的 "作用域" 將會是整個應用. 另一方面, 如果你在一個 for 循環中創建了引用了全局單例的一個局部變量 - 那么這個局部變量就擁有比全局變量小很多的作用域.
Autofac中 生命周期作用域 的概念其實是把這兩個概念組合在了一起. 實際上, 生命周期作用域等同于你應用中的一個工作單元. 一個工作單元將會在開始時啟動生命周期作用域, 然后需要該工作單元的服務被從生命周期作用域中解析出. 當你解析服務時, Autofac將會追蹤被解析的可釋放/可銷毀 (IDisposable) 組件. 在工作單元最后, 你釋放了相關的生命周期作用域然后Autofac將會自動清理/釋放那些被解析的服務.
生命周期控制作用域的兩個要素是共享和釋放.
生命周期作用域是可嵌套的并且它們控制了組件如何共享. 例如, 一個 "單例" 服務也許會從根生命周期解析因為每個獨立的工作單元會需要它們各自的服務實例. 你可以通過 注冊時設置實例作用域 決定組件如何共享.
生命周期作用域追蹤可釋放對象并且當生命周期作用域被釋放同時釋放它們. 例如, 如果你有個實現 IDisposable 的組件并且你從生命周期中解析了它, 生命周期作用域將會保持住它并且替你釋放它, 這樣你的服務消費者就不必知道它的內在具體實現. 你有能力選擇控制該行為或者添加一個新的釋放行為.
在你的應用中, 最好記住以下概念這樣就能有效使用你的資源.
永遠從一個生命周期作用域而不是從根容器中解析服務. 由于生命周期作用域有追蹤可釋放資源的性質, 如果你從一個容器 ("根生命周期作用域") 中解析了太多組件, 無意間也許你就會造成內存泄露. 根生命周期會在它存在的時間 (通常是應用的生命周期) 內保持住可釋放組件因此它也能釋放它們. 你可以選擇性的改變釋放行為, 但從作用域內解析是個良好的實踐. 如果Autofac檢測到使用單例或共享組件, 它會自動把它們安放在一個合適的追蹤作用域之內.
讓我們看下web類應用, 把它作為一個更好闡述生命周期作用域的具體例子. 假設有以下場景:
你有一個全局的單例logging服務.
兩個請求同時進入到web應用中.
每個請求是一個邏輯上的 "工作單元" 并且每個請求需要它們各自的order processing service.
每個order processing service 要用 logging service 記錄信息.
在這種場景中, 你有一個根作用域, 包含單例的logging service并且每個請求有一個子生命周期, 每個有它們自己的order processing service:
+---------------------------------------------------+
| Autofac Container |
| Root Lifetime Scope |
| |
| Logging Service |
| (shared across all requests) |
| |
| +----------------------+ +----------------------+ |
| | First Request Scope | | Second Request Scope | |
| | | | | |
| | Order Processor | | Order Processor | |
| +----------------------+ +----------------------+ |
+---------------------------------------------------+
每個請求結束時, 請求的生命周期也結束并且各自的訂單處理程序得到釋放. logging service作為一個單例, 將會保持存在并以備后續請求共享.
更多生命周期作用域相關章節:
總結
以上是生活随笔為你收集整理的autofac 作用域_控制作用域和生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# js popup_c#一个popu
- 下一篇: antd 能自适应吗_自首要满足的条件有