autofac 元件的例項範圍

2022-08-19 07:30:19 字數 3230 閱讀 4493

例項範圍決定如何在請求之間共享服務。

使用這個選項,每次請求服務都會返回乙個新例項。使用 instanceperdependency() 指定。這是預設選項。下面的**,第2行和第3行是等價的。

1

var builder = new

containerbuilder();

2 builder.registertype();

3 builder.registertype().instanceperdependency();

下面的**,每次迴圈都生成乙個新的例項,一共生成 100 個例項。

using(var scope =container.beginlifetimescope())

}

使用這個選項,在根範圍或巢狀範圍中請求服務,都返回同乙個的例項。使用 singleinstance() 指定。

var builder = new

containerbuilder();

builder.registertype

().singleinstance();

下面的**,w1 和 w2 始終是同乙個物件,100 次迴圈只有乙個 worker 類的例項。

using(var scope1 =container.beginlifetimescope())

}}

使用這個選項,在特定的 ilifetimescope 中請求服務,只返回乙個例項。使用 instanceperlifetimescope() 指定。下面的**中,scope1 中的 100 次 w1 是同乙個物件,scope2 中的 100 次 w2 是同乙個物件,但是 w1 和 w2 不是同乙個物件。

var builder = new

containerbuilder();

builder.registertype

().instanceperlifetimescope();

using(var scope1 =container.beginlifetimescope())

}using(var scope2 =container.beginlifetimescope())

}

類似於上面【每個生命週期範圍乙個例項】,但可以提供更多控制。使用此選項,允許為 ilifetimescope 物件提供「標記」。在標記匹配的範圍中只有乙個例項。使用 instancepermatchinglifetimescope() 方法指定。

var builder = new

containerbuilder();

builder.registertype

().instancepermatchinglifetimescope("

x");

下面的**中,w1 和 w2 相同,w3 和 w4 相同,但 w1 和 w3 不同。

using(var scope1 = container.beginlifetimescope("x"

)) }

}using(var scope3 = container.beginlifetimescope("x"

)) }

}

解析時必須提供提供合適的標記,以下**會丟擲異常。

using(var notagscope =container.beginlifetimescope())

有些應用程式天然具有【請求】語義,例如 asp.net mvc 或 webform 應用程式。【每個請求乙個例項】在【每個匹配的生命週期範圍乙個例項】基礎上,通過提供範圍標記,註冊函式和常見型別整合實現。本質上是【每個匹配的生命週期範圍乙個例項】。

var builder = new

containerbuilder();

builder.registertype

().instanceperrequest();

asp.net core 使用【每個生命週期範圍乙個例項】,而不是【每個請求乙個例項】。owned隱式關聯型別建立巢狀的生命週期範圍。使用 instance-per-owned 註冊,可將依賴限定在 owned 例項中。

var builder = new

containerbuilder();

builder.registertype

();builder.registertype

().instanceperowned();

本例中 serviceforhandler 服務會限制在 messagehandler 例項範圍內。

using(var scope =container.beginlifetimescope())

autofac 可以強制使a執行緒的物件不滿足b執行緒的依賴。

var builder = new

containerbuilder();

builder.registertype

() .instanceperlifetimescope();

var container = builder.build();

然後讓每個建立自己的 lifetime scope

void

threadstart()

}

重要:在多執行緒場景下,要小心不要將父範圍清理掉。否則,派生執行緒中的子範圍將無法解析服務。

每個執行緒都將有自己的 mythreadscopedcomponent 例項,本質上是生命週期範圍內的單例。範圍內的例項不會提供到外部,因此很容易保持執行緒間的元件隔離。

通過新增 ilifetimescope 引數,可將父範圍注入到生成執行緒的**中,autofac 會將當前範圍自動注入,接下來可以使用它建立巢狀範圍。

public

class

threadcreator

public

void

threadstart()}}

如果想進一步控制,可以使用【每個匹配的生命週期範圍乙個例項】將執行緒範圍的元件同內部生命週期範圍關聯起來,這個方式的效果如圖:

圖中的"context"是 beginlifetimescope 方法建立的生命週期範圍。

Autofac 之二 例項

附上參考位址 通過上文明白了什麼是ioc,下面就大概具體的了解一下實現ioc的乙個容器autofac,先看 從資料庫讀資料介面 public inte ce iuserstorewhere t class 具體讀資料的實現 public class mysqluserstore iuserstore...

autofac 獲取註冊後的例項

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

autofac文件 例項生命週期

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