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