【翻譯Autofac的幫助文檔】1.入門指南

【寫在前面】嘗試作完一件工做以外自我以爲有意義的一件事,那就從翻譯Autofac的幫助文檔吧。html

入門指南

將Autofac集成你的應用程序的步驟一般很簡單,通常是:ui

  • 時刻以IOC(控制反轉)的思想來規劃你的應用程序
  • 在你的Porject中添加Autofac引用
  • 按照以下步驟設計應用程序的啓動環節
    • 建立一個ContainerBuilder
    • 向ContainerBuilder註冊組件
    • 經過ContainerBuilder的Build()方法得到Container(後續需用到)
  • 在應用程序運行環節時,按以下步驟執行
    • 經過Container得到一個lifetime scope
    • 經過lifetime scope解析出組件實例
    • 經過實例繼續執行

本篇將經過入門指南實現一個簡單的Console應用程序,一旦有了基礎,後續能夠延伸集成WCF、ASP.NET等等。this

規劃應用程序

先簡單解釋一下IOC(控制反轉)。
一般狀況下,類A若須要類B的一些功能,則在類A中須要經過「new」操做來完成建立和使用功能,這樣在代碼層面就固定住了類A和類B之間的相互依賴關係。這樣的「依賴」,在後續的重構或修改時,影響面很大。
而IOC(控制反轉)的思惟,則是取消,由類A來建立類B,變動爲在執行期間,由IOC容器來根據須要和約定自動建立類B來給類A使用。spa

Martin Fowler有一篇著名的文章,解釋何謂IOC,能夠點擊「連接」查看。.net

在本篇的示例中,咱們將定義一個類,這個類能夠輸出一些數據;但咱們不想和Console綁定住,由於咱們並不能肯定在實際使用過程當中Console是否真的可用。翻譯

咱們一般能夠這樣實現:設計

添加Autofac引用

第一步,須要在項目中添加Autofac的引用。建議經過NuGet方式(以下圖),將會自動添加到項目中。對象

Autofac,除了Core以外,還有不少擴展,例如和ASP.NET MVC集成等等。blog

截至目前爲止,Autofac Core最新版本爲4.6.0,對應.net framework 4.5.

應用程序啓動

在應用程序啓動環節,你須要建立一個ContainerBuilder來註冊組件。
一個組件,能夠是一個表達式,一個.NET類型,又或者能夠是一個或者多個帶依賴項的Service等等。

簡單來講,以下這個實現接口的.NET類,咱們有兩種方式來定義它的類型。 

  • 做爲類型自身,那就是SomeType
  • 做爲接口,那就是IService

如上的例子,組件就是SomeType,同時也是包括SomeType和IService的兩種形態的服務。

在Autofac,你能夠按照以下方式向ContainerBuilder註冊組件。

對於咱們的示例應用程序,咱們須要註冊全部組件(類),並公開它們的服務(接口),這樣就能夠很好地鏈接起來。

咱們還須要保存Container,以便之後可使用它來解析類型。

如今咱們有一個Container,全部的組件都已註冊,而且它們正在公開適當的服務。讓咱們利用它吧。

應用程序執行

在應用程序執行,你須要使用你註冊的組件時,是經過lifetime scope來解析出相應組件實例的。

Container自己也是一個lifetime scope,從技術角度來講,你能夠從Container直接解析出組件,然而並不推薦這樣用。

解析一個組件時,將會根據所定義的實例範圍,建立一個對象的新實例。(解析一個組件大體至關於調用「new」實例化一個類。很簡單的一個類比。),某些組件可能有特殊的Dispose(如組件自己實現了IDisposable)- Autofac能夠在lifetime scope終止時也會自動處理這些組件特殊的Dispose。

Container這個lifetime scope,在應用程序執行時會一直存在。因此,若是用Container來解析全部的組件的話,能夠想象當應用程序終止時,Dispose將是多麼繁忙的景象(全部的組件等待被Dispose),一樣,由於直到最後一刻纔會被Dispose,會更大概率引起「內存不足」這個問題。

因此,推薦從Container建立一個新的lifetime scope來解析組件,在完成相關執行代碼後,lifetime scope連帶着組件便可被釋放。

(一旦你使用了Autofac integration libraries,建立和使用lifetime scope後就能夠徹底忘記它)

對於咱們的示例應用程序,咱們將建立一個lifetime scope,而後解析出writer這個組件,並執行「writedate」方法。

如今運行程序…

  • 「writedate」方法要求一個idatewriter。
  • autofac看到idatewriter映射到TodayWriter,開始建立一個todaywriter。
  • autofac看到todaywriter須要ioutput來完成構造。
  • autofac看到ioutput映射到consoleoutput,因此建立一個新的consoleoutput實例。
  • autofac採用新consoleoutput實例完成建設TodayWriter。
  • autofac返回徹底構成TodayWriter,能夠開始執行「writedate」了。

之後,若是你但願應用程序寫另外一個日期的話,能夠實現一個不一樣的idatewriter而後改變登記程序的啓動。你不須要改變其餘的類。是的,這就是IOC(控制反轉)!

注意:通常來講,Service很大程度上被認爲是一種反模式(看文章)。所以,在你的程序中人工建立scope並使用Container,這種方式不是最好的。使用「Autofac integration libraries」,你一般不須要像示例程序那樣人工建立scope。固然,你如何設計應用程序取決於你本身。

本篇結束。

後述:完整的英文版連接在此:http://autofac.readthedocs.io/en/latest/getting-started/index.html,有部份內容沒有翻譯,也有部份內容自我感受翻譯的並不恰當。若你有意見和建議,可聯繫我。

本博文屬做者原創,首發於www.boxfun.net,除非特別聲明,本做品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

相關文章
相關標籤/搜索