Autofac 之二 例項

2022-09-13 19:03:09 字數 2365 閱讀 5587

附上參考位址(

通過上文明白了什麼是ioc,下面就大概具體的了解一下實現ioc的乙個容器autofac,先看**:

//從資料庫讀資料介面

public inte***ce iuserstorewhere t : class

//具體讀資料的實現

public class mysqluserstore : iuserstore,

new muser };}

}//處理業務的介面

public inte***ce iuserserver

//處理業務的實現

public class userserver : iuserserver

public listuserlist()

}

從上面的**可以發現,我們在需要處理具體業務的時候,只需要關注實現了iuserserver 的例項就可以了,以mvc中的controller為例,我們在呼叫userlist()方法時,在沒有ioc的情況下,我們可能會這樣處理:

可以看出,我們在homecontroller 手動的指定了iuserserver對應的例項,以及該例項的構造需要的例項,這樣很明顯的例項的控制權還是沒有剝離開來,所以當我們使用ioc容器之後,可以向下面這樣:

我們把會用到的「元件」 都註冊到容器裡面去,當需要使用的時候通過scope.resolve>(); 就可以得到我們需要的例項,這樣就把物件的建立、管理交給了第三方控制即autofac。

當然,在真正的程式裡面container 我們肯定是放到乙個全域性的地方,整個生命週期維護乙個container,有統一註冊「元件」的地方,在controller裡面只需要直接resolve需要的例項即可,這兒只是為了方便理解,所以把容器的註冊和使用放在了一起。

autofac 在建立userserver的例項時,發現該例項的構造需要實現了iuserstore的例項,於是會在容器中找是否有該例項,因為註冊了mysqluserstore 所以在建立userserver的例項時會自動建立mysqluserstore例項

雖然可以使用container.resolve 來直接獲取例項,但是官網更推薦使用 beginlifetimescope,來防止記憶體洩漏

很明顯現在存在幾個問題:

}

autofac 提供webapi、mvc...的整合,這兒已webapi2為例,首先安裝 autofac.webapi2 nuget package

使用registerapicontrollers將api的controllers 全部註冊到容器中去,同時通過設定dependencyresolver,使得我們在controllers 中使用「元件」的時候就可以通過構造方法直接獲取了,這也就解決了到處去resolve 得問題

registerapicontrollers的用法還有很多,通常我們的controller都是繼承ihttpcontroller 的,字尾都是controller,那麼當我們自定義了controller了時可以使用registertype().instanceperrequest()註冊,同時也可以自定義字尾: registerapicontrollers("mycustomsuffix", assembly.getexecutingassembly());

到這,我麼依然需要每個「元件」都去註冊,我們可以通過所有屬性繼承乙個介面來解決這個問題

public inte***ce idependency

}

autofac 元件的例項範圍

例項範圍決定如何在請求之間共享服務。使用這個選項,每次請求服務都會返回乙個新例項。使用 instanceperdependency 指定。這是預設選項。下面的 第2行和第3行是等價的。1 var builder new containerbuilder 2 builder.registertype ...

autofac 獲取註冊後的例項

在一些情境下,不想使用構造器獲得例項物件,所以.使用 dependencyresolver,當然,這個只能在mvc例項化controller時才會生效,對bll和dll介面是沒辦法獲取例項物件的。所以在註冊ioc例項時,需要把ioc容器賦值到全域性變數 public class iocconfig ...

autofac文件 例項生命週期

開始 registering components 控制作用域和生命週期 用模組結構化autofac xml配置 與.net整合 深入理解autofac 指導關於 詞彙表例項生命週期決定的在同乙個服務的每個請求中例項是如何共享的。當請求乙個服務的時候,autofac會返回乙個單例 single in...