[翻譯] Autofac 控制範圍和生命周期

来源:http://www.cnblogs.com/dongbeifeng/archive/2016/03/28/autofac-controlling-scope-and-lifetime.html
-Advertisement-
Play Games

原文鏈接: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    | |
| +----------------------+ +----------------------+ |
+---------------------------------------------------+

請求結束時,訂單處理服務將隨生命周期範圍一同被清理。而日誌服務是單例服務,將繼續存活,供後續的請求使用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼叫架構?揭開架構神秘的面紗,無非就是:分層+模塊化。任意複雜的架構,你也會發現架構師也就做了這兩件事。 本文將會全面的介紹我們團隊在模塊化設計方面取得的經驗。之所以加了“全面”二字,是因為本文的內容將會涉及到:資料庫、路由、C#、JavaScript、CSS、HTML等一個完整模塊所需要的內容。 ...
  • 序言 在.Net的世界中,一提及SOA,大家想到的應該是Web Service,WCF,還有人或許也會在.NET MVC中的Web API上做上標記,然後泛泛其談! 的確,微軟的這些技術也確實推動著面向服務的世界發展,當然除了微軟還有很多面向服務的開源技術,甚至在某些方面比微軟做的更加優秀。那麼什麼 ...
  • 一、前言 面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題。 享元模式正是為解決這一類問題而誕生的。享元模式通過共用技術實現相同或相似對象的重用。 在享元模式中通常會出現工廠模式,需要創建一個享 ...
  • * 軟體腐化的原因: 問題所在 設計目標 過於僵硬 可擴展性(新性能可以很容易加入系統)過於脆弱 靈活性(修改不會波及其它)復用率低 粘度過高 可插入性(新功能容易加入系統(氣囊加入方向盤)) * 提高系統可復用性的幾點原則:傳統復用:1. 代碼的粘帖復用2. 演算法的復用3. 數據結構的復用 * 可 ...
  • 一、引言 提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之後我們可以根據自己的情況填充不 ...
  • 一、引言 在軟體開發過程中,有些對象有時候會由於網路或其他的障礙,以至於不能夠或者不能直接訪問到這些對象,如果直接訪問對象給系統帶來不必要的複雜性,這時候可以在客戶端和目標對象之間增加一層中間層,讓代理對象代替目標對象,然後客戶端只需要訪問代理對象,由代理對象去幫我們去請求目標對象並返回結果給客戶端 ...
  • 引:通常我們在編寫代碼的時候全部都是用別人設計好的庫和框架。我們利用他們的API編譯成我們的程式、享受運用別人的代碼所帶來的優點。我們從中挑選所要的組件,把它們運用在合適的地方。但是,庫與框架無法幫助我們將應用組織成容易瞭解、容易維護、具有彈性的架構,所以需要設計模式。(廣告詞) OO基礎 抽象 封 ...
  • 一、引言 在軟體開發過程,如果我們需要重覆使用某個對象的時候,如果我們重覆地使用new創建這個對象的話,這樣我們在記憶體就需要多次地去申請記憶體空間了,這樣可能會出現記憶體使用越來越多的情況,這樣的問題是非常嚴重,然而享元模式可以解決這個問題,下麵具體看看享元模式是如何去解決這個問題的。 二、享元模式的詳 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...