將autofac整合到您的應用程式的基本模式是:
記住控制反轉(ioc)的結構。
新增autofac引用。
在應用程式啟動...
建立乙個containerbuilder。
註冊元件。
構建容器並將其儲存以備後用。
在執行應用程式時
從容器建立乙個生命週期範圍。
使用生命週期作用域來解析元件的例項。
本入門指南將引導您完成簡單的控制台應用程式的這些步驟。 一旦您掌握了基本知識,您可以檢視wiki的其他部分,以獲取有關wcf,asp.net和其他應用程式型別的更高階用法和整合資訊。
控制反轉背後的想法,而不是把你的應用程式中的類繫結在一起,讓類「新建」它們的依賴關係,你可以切換它,所以在構造類的時候依賴關係被傳入。martin fowler
有乙個很好的文章解釋依賴注入/控制反轉
。
對於我們的示例應用程式,我們將定義乙個將當前日期寫入的類。 但是,我們不希望它繫結到控制台,因為我們希望能夠稍後測試該類,或者在控制台不可用的地方使用它。
我們也會盡量讓寫日期的機制被抽象出來,所以如果我們稍後想換乙個寫明天日期的版本的話,那將是乙個很好的選擇。
我們會做這樣的事情:
using system;
//ioutput介面的這種實現實際上是我們如何寫入控制台。 從技術上講,我們也可以實現ioutput來寫入除錯或跟蹤...或其他任何地方。
public
class consoleoutput : ioutput
}//這個介面把執行寫操作的實際機制的寫日期的概念分離出來。 和ioutput一樣,這個過程在乙個介面後面被抽象出來。
public
inte***ce idatewriter
//這個todaywriter是所有匯聚一起的地方。
//請注意,它需要乙個型別為ioutput的構造函式引數 - 它允許編寫者根據實現寫入任何地方。 此外,它實現了writedate,使得今天的日期被寫出來;
//你可以用不同的格式或不同的日期寫乙個。
public
class todaywriter : idatewriter
public
void
writedate()
}}
現在我們有了乙個合理的結構(如果有的話)依賴關係,讓我們來看看autofac吧!
第一步是將autofac引用新增到您的專案中。 對於這個例子,我們只使用核心autofac。 其他應用程式型別可能會使用額外的autofac整合庫。
最簡單的方法是通過nuget。 「autofac」軟體包具有您所需的所有核心功能。
在應用程式啟動時,您需要建立乙個containerbuilder
並向其註冊元件。 元件是表示式,.net
型別或其他一些**,它們公開乙個或多個服務,並且可以採用其他依賴關係。
簡而言之,想一下實現介面的.net型別,如下所示:
public
class sometype : iservice
您可以通過以下兩種方式之一來解決該型別問題:
作為型別本身,sometype
作為介面,乙個iservice
在這種情況下,元件是sometype
,它公開的服務是sometype
和iservice
。
在autofac中,你可以用乙個containerbuilder
註冊這樣的東西:
// 建立你的構建者
var builder = new containerbuilder();
//通常你只想通過介面暴露這個型別:
builder.registertype().as
();//但是,如果你想要兩種服務(不常見),你可以這樣說:
builder.registertype().asself().as
();
對於我們的示例應用程式,我們需要註冊我們所有的元件(類)並公開他們的服務(介面),這樣可以很好地連線起來。
我們還需要儲存容器,以便稍後可以使用它來解析型別。
using system;
using autofac;
static
void main(string args)
}}
現在我們有乙個包含所有元件註冊的容器,並且提供了正確的服務。讓我們來利用它。
在執行應用程式時,您需要使用您註冊的元件。你可以通過解決他們的生命週期域來做到這一點。
容器本身是乙個有生命週期範圍,你可以在技術上直接從容器中解決問題。但不建議直接從容器中解析。
在解析元件時,根據您定義的例項範圍,將建立物件的新例項。 (解析乙個元件大致等同於呼叫「new」來例項化乙個類,這實際上是真正的簡化了它,但是從模擬的角度來看它沒問題)。一些元件可能需要處理(就像它們實現idisposable一樣) - autofac可以處理在處置壽命範圍時為您配置這些元件。
但是,容器在您的應用程式的整個生命週期中都存在。如果你直接從容器中解決了很多東西,最終可能會有很多東西在等待處理。這不好(你可能會看到乙個「記憶體洩漏」)。
相反,從容器中建立乙個子生命週期範圍並從中解決。當你完成解決元件,處理子範圍,一切都為你清理。
(當你使用autofac整合庫時,這個子範圍的建立基本上是為你完成的,所以你不必考慮它。)
對於我們的示例應用程式,我們將實現「writedate」方法來從作用域獲取寫入器,並在完成時處理作用域。
static
void main(string args)
public
static
void
writedate()}}}
now when you run your program…
「writedate」方法向autofac請求idatewriter。
autofac看到idatewriter對映到todaywriter,所以開始建立todaywriter。
autofac認為todaywriter在其建構函式中需要乙個ioutput。
autofac將ioutput對映到consoleoutput,以建立乙個新的consoleoutput例項。
autofac使用新的consoleoutput例項來完成構建todaywriter。
autofac返回完全構建的`「writedate」`todaywriter給使用消費者。
之後,如果您希望應用程式寫入不同的日期,則可以實現不同的idatewriter,然後在應用程式啟動時更改註冊。你不必改變任何其他類。很好,控制反轉!
注意:一般來說,服務定位在很大程度上被認為是反模式(見文章)。也就是說,在任何地方手動建立作用域,並通過**來使用容器不一定是最好的方法。使用autofac整合庫,您通常不必執行上面示例應用程式中的操作。相反,事情從應用程式的**「頂級」位置解決,而手動解決方案很少見。當然,你如何設計你的應用程式取決於你。
示例應用程式給你乙個如何使用autofac的想法,但還有很多你可以做的。
檢視整合庫列表,了解如何將autofac與您的應用程式整合。
了解如何註冊增加靈活性的元件。
了解autofac配置選項,以便您更好地管理元件註冊。
寫在一開始
沒想到畢業9年後要把這個賬號找回來了。大學時在華工百步梯和電子設計比賽中度過了愉快的時光,但是畢業時貪圖享受來到乙個山溝溝裡蓋電廠。電廠蓋好了,但依然無法融入這個山溝溝。為了能回深圳跟女友和家人團聚,努力拼搏,集團深圳分公司想要我,但這裡卻不放。沒有辦法,動起了重新拾起程式設計,回深圳找工作的念頭。...
C primer 筆記(一) 開始
1.1 編寫乙個簡單的c 程式 乙個函式包含四個部分 1 返回型別 2 函式名 3 乙個圓括號包圍的形參列表 允許為空 4 函式體 main函式的返回值型別必須為int。1.2 初識輸入輸出 標準輸入輸出庫 iostream庫,包含兩個基礎型別 1 輸入流istream 2 輸出流ostream.標...
一開始就做對
昨天弄了一天的右鍵選單,總是出現錯誤,一是flex幾個內建的右鍵選單沒法隱藏起來,二是用.swf和ie瀏覽器兩種不同的方式除錯程式的時候出現了不同的結果.到晚上我煩了,想看下在air裡執行會是什麼樣的一種情況,結果看了之後我很鬱悶,好像air本身就已經完全遮蔽掉了所有內建的右鍵選單.我現在做的東西最...