Autofac官方文件 一 開始

2021-08-11 11:51:58 字數 3801 閱讀 9045

將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,它公開的服務是sometypeiservice

在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本身就已經完全遮蔽掉了所有內建的右鍵選單.我現在做的東西最...