Autofac 屬性注入

2022-02-13 12:30:17 字數 2610 閱讀 6551

屬性注入不同於通過建構函式方式傳入引數. 這裡是通過注入的方式, 在類建立完畢之後, 資源釋放之前, 給屬性賦值.

這裡, 我重新弄一些類來演示這一篇吧.

public

class

classa

public

void

show()

}public

class

classb

public

void

show()

}public

class

classc

public classd d

public

void

show()

}public

class

classd

}

1. 一般方法

var builder = new

containerbuilder();

builder.register(n => new classc );

builder.registertype

();var container =builder.build();

var c = container.resolve();

c.show();

c.d.show();

這種方法, 不止可以注入屬性, 還可以給字段賦值

2. 反射的方式

var builder = new

containerbuilder();

builder.registertype

();var s = builder.registertype().propertiesautowired();

var container =builder.build();

var c = container.resolve();

c.show();

c.d.show();

這裡需要注意一點, 由於classc中有classd格式的屬性, 所以classd也必須要註冊一下. 為什麼呢? 來看一下原始碼

propertiesautowired()方法裡面, 主要就是呼叫上圖中的方法. 會通過反射的方式獲取屬性, 然後也是通過resolve的方式來獲取屬性的值.

注:仔細觀察classa和classb, 可以發現, 他們迴圈依賴了, 那麼如果我要得到classb, 怎麼辦? 嘗試下第一種方法, 你會發現, 我去, 報錯了.

嘗試下第二種方法, 還是報錯. 那怎麼辦呢? 

var builder = new

containerbuilder();

builder.registertype

().propertiesautowired(propertywiringoptions.allowcirculardependencies).singleinstance();

builder.register(n=>new classa(n.resolve()));

var container =builder.build();

var b = container.resolve();

b.show();

b.a.show();

還是通過反射的方式, 只不過要注意一下, 傳入引數和singleinstance, 不加, 都會報錯的.

3. 通過名稱

var builder = new

containerbuilder();

var s = builder.registertype().withproperty("

d", new

classd());

var container =builder.build();

var c = container.resolve();

c.show();

c.d.show();

通過屬性名稱, 直接new乙個例項給他

4. onactivating/onactivated 方式

此方法的執行時機, 是建構函式建立結束之後, 資源釋放之前, 所以在此期間也可以實現

var builder = new

containerbuilder();

builder.registertype

().onactivating(e => e.instance.d = e.context.resolve());

builder.registertype

();var container =builder.build();

var c = container.resolve();

c.show();

c.d.show();

這裡的 onactivating 也可換成 onactivated . 實現這裡的場景, 是能得到一樣的結果的.

參考:autofac使用方法總結

autofac 元件、服務、自動裝配 《第二篇》

autofac文件

Autofac 屬性注入

只有物件是通過注入方式獲取時,它的屬性物件才可以被自動注入 例如 class mother public iserviceprovider configureservices iservicecollection services containerbuilder builder new conta...

autofac文件 屬性注入

開始 registering components 控制範圍和生命週期 用模組結構化autofac xml配置 與.net整合 深入理解autofac 指導關於 詞彙表屬性注入使用可寫屬性而不是構造函式引數實現注入。如果component是乙個委託,使用乙個物件初始化 builder.registe...

依賴注入容器Autofac

在.net上現在存在許多的依賴注入容器,我也在實踐中使用過castle windsor structuremap autofac unity。這些容器的簡要介紹可以參看 ioc in net part 1 autofac ioc in net part2 structuremap ioc in ne...