乙個簡單的小程式演示Unity的三種依賴注入方式

2021-09-23 00:09:26 字數 3655 閱讀 4941

首先建立乙個控制台程式,並新增如下兩個基於unity的程式集被引用:microsoft.practices.unity.dll和microsoft.practices.unity.configuration.dll。然後定義如下幾個介面(ia、ib、ic和id)和它們各自的實現類(a、b、c、d)。在型別a中定義了3個屬性b、c和d,其型別分別為介面ib、ic和id。其中屬性b在構在函式中被初始化;屬性c上應用了microsoft.practices.unity.dependencyattribute特性,意味著這是乙個需要以屬性注入方式被初始化的依賴屬性;屬性d則通過方法initialize初始化,該方法上應用了microsoft.practices.unity.injectionmethodattribute,意味著這是乙個注入方法會被自動呼叫。

1:

namespace unitydemo

2:
4:

public

inte***ce ib

5:

public

inte***ce ic

6:

public

inte***ce id {}

7:
8:

public

class a : ia

9:
11:         [dependency]
12:

public ic c

13:

public id d

14:
15:

public a(ib b)

16:
19:         [injectionmethod]
20:

public

void initialize(id d)

21:
24:     }
25:

public

class b: ib{}

26:

public

class c: ic{}

27:

public

class d: id{}

28: }

然後我們為該應用新增乙個配置檔案,並定義如下一段關於unity的配置。在這段配置中,定義了乙個名稱為defaultcontainer的unity容器,並在其中完成了上面定義的介面和對應實現類之間對映的型別匹配。

1:

<?

xmlversion

="1.0"?>

2:

<

configuration

>

3:

<

configsections

>

4:

<

section

name

="unity"

type

="microsoft.practices.unity.configuration.unityconfigurationsection, microsoft.practices.unity.configuration"

/>

5:

configsections

>

6:

<

unity

>

7:

<

containers

>

8:

<

container

name

="defaultcontainer"

>

9:

<

register

type

="unitydemo.ia, unitydemo"

mapto

="unitydemo.a, unitydemo"

/>

10:

<

register

type

="unitydemo.ib, unitydemo"

mapto

="unitydemo.b, unitydemo"

/>

11:

<

register

type

="unitydemo.ic, unitydemo"

mapto

="unitydemo.c, unitydemo"

/>

12:

<

register

type

="unitydemo.id, unitydemo"

mapto

="unitydemo.d, unitydemo"

/>

13:

container

>

14:

containers

>

15:

unity

>

16:

configuration

>

最後在main方法中編寫如下的程式:建立乙個代表ioc容器的unitycontainer物件,並載入配置資訊對其進行初始化。然後呼叫它的泛型的resolve方法建立乙個實現了泛型介面ia的物件。最後將返回物件轉變成型別a,並檢驗其b、c和d屬性是否是空。

1:

static

void main(string args)

2: ", a.b == null ? "yes" : "no");
10:         console.writeline("a.c == null ? ", a.c == null ? "yes" : "no");
11:         console.writeline("a.d == null ? ", a.d == null ? "yes" : "no");
12:     }
13: }

從如下給出的執行結果我們可以得到這樣的結論:通過resolve方法返回的是乙個型別為a的物件;該物件的三個屬性被進行了有效的初始化。這個簡單的程式分別體現了介面注入(通過相應的介面根據配置解析出相應的實現型別)、構造器注入(屬性b)、屬性注入(屬性c)和方法注入(屬性d)。

1: a.b == null ? no
2: a.c == null ? no
3: a.d == null ? no

所謂控制反轉(ioc: inversion of control)就是應用本身不負責依賴物件的建立和維護,而交給乙個外部容器來負責。這樣控制權就由應用轉移到了外部ioc容器,控制權就實現了所謂的反轉。比如,在型別a中需要使用型別b的例項,而b例項的建立並不由a來負責,而是通過外部容器來建立。

有時我們又將ioc成為依賴注入(di: dependency injection)。所謂依賴注入,就是由外部容器在執行時動態地將依賴的物件注入到元件之中。具體的依賴注入方式又包括如下三種典型的形式。

在開源社群,具有很有流行的ioc框架,比如castle windsor、unity、spring.net、structuremap、ninject等。

微博:www.weibo.com/artech

蔣金楠的自**將會停用)。

乙個簡單小程式

實現這麼乙個程式 從磁碟上讀取檔案,對檔案內容解析,解析出兩個加數,生成乙個可以執行加法運算的動態庫,呼叫該動態庫進行加法計算,再將計算結果寫入共享記憶體,然後建立子程序,子程序進行程式替換,替換的程式要完成的任務就是將共享記憶體中的內容重新寫回磁碟上的該檔案,記得使用共享記憶體時要借助訊號量保證互...

乙個簡單的verlig程式 乙個簡單C程式的介紹

我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...

Unity網路互動丨乙個簡單的網路程式

本章目的 實現乙個簡單的網路程式,了解基本的內容 方法 建立乙個伺服器端vs工程,乙個客戶端vs工程 此時開著兩個vs!先執行伺服器端工程,再執行客戶端工程 開始執行,不除錯 看到客戶端先向伺服器傳送字串,伺服器端收到後,將這個字串返回到客戶端,客戶端將它列印出來 以下是上述兩個工程 using s...