Unity IOC容器的簡單應用

2021-06-07 20:47:30 字數 3385 閱讀 7137

unity是unity是微軟patterns& practices組用c#實現的輕量級,可擴充套件的依賴注入容器,它為方便開發者建立鬆散耦合的應用程式,

有以下優點:

1.簡化了物件的建立,特別是針對分層物件結構和依賴關係;

2.需求的抽象,允許開發人員在執行時或配置檔案中指定依賴關係,簡化橫切關注點的管理;

3.推遲為容器配置元件的時機,增加了靈活性;

4.服務定位能力,這使客戶能夠儲存或快取容器;

5.例項和型別攔截

目前最新的版本為 unity 3.0 for .net 3.5 preview

以下程式用的是2.1版本

下面開始unity之旅

(一) 我的第乙個unity demo

新建乙個控制台應用程式,引用microsoft.practices.unity.dll檔案; 

新建乙個鳥類的介面,定義乙個鳥叫的方法;

/// /// 鳥類介面

///

public inte***ce ibird

對這個介面進行實現:

/// /// 燕子

///

public class swallow : ibird

}

在mian方法中通過unity實現ioc反轉控制;

static void main( string args )

執行結果:

這個小例項已經實現了簡單的ioc控制反轉.

當乙個介面有兩個實現怎麼辦呢?是不是在加乙個類似於下邊的**就行了呢? 下面試一下.

unitycontainer.registertype();我們在原有的程式中加乙個sparrow類,實現ibird介面:

public class sparrow : ibird

}

main方法**:

//例項化乙個控制器

iunitycontainer unitycontainer = new unitycontainer();

//實現注入

unitycontainer.registertype();

unitycontainer.registertype();

ibird bird = unitycontainer.resolve();

bird.say();

console.read();

執行一下,結果:

嗯?這是什麼情況,為什麼是麻雀在叫..而不是燕子叫呢? 原來

當乙個介面有多個實現,而且沒有用別名區分時,就會選擇最後乙個注入的實現;

下邊給每個注入都加上別名:

//例項化乙個控制器

iunitycontainer unitycontainer = new unitycontainer();

//實現注入,用別名區分實現

unitycontainer.registertype("swallow");

unitycontainer.registertype("sparrow");

ibird swallow = unitycontainer.resolve("swallow");

ibird sparrow = unitycontainer.resolve("sparrow");

swallow.say();

sparrow.say();

console.read();

執行結果:

這才是我們想要的結果,哈哈.....

當乙個介面有多個實現時,需要通過別名區分。

(二) unity的建構函式注入

新建 乙個ibirdhome 介面,並對介面進行實現:

/// /// 小鳥的家

///

public inte***ce ibirdhome

}/// /// 小鳥的家

///

public class birdhome : ibirdhome

public birdhome(ibird bird)

}

main方法如下:

//例項化乙個控制器

iunitycontainer unitycontainer = new unitycontainer();

//實現注入

unitycontainer.registertype();

unitycontainer.registertype();

ibirdhome birdhome = unitycontainer.resolve();

birdhome.swallow.say();

console.read();

執行結果:

我們只是通過unity得到了乙個ibirdhome實現,但並沒有對 ibird swallow  進行例項化,但結果已經執行出來,並沒有報錯.

原來這些工作unity已幫我們做了,我們可以偷個懶了.嘿嘿.......

(三)屬性注入

把birdhome類的中建構函式去掉,在屬性上加上[dependency]特性

/// /// 小鳥的家

///

public class birdhome : ibirdhome

}

執行結果與上結果一樣,親,不信,試試!

(四) 初使化器注入(自已起的名字)

初使化器注入與建構函式注入相似,但不用寫到建構函式裡邊,而是在初使化方法上加上[injectionmethod]特性

/// /// 初始化器注入

///

///

[injectionmethod]

public void initialize(ibird bird)

執行結果依然是:

生命不息,程式設計不止!

map容器簡單應用

需要按照編號將一組資料排序顯示,我一下子就想到了容器。以前曾經用過map,所以還是用map來實現吧。之前,完整地看完了 c 標準程式庫 並且也讀過侯捷老師的 stl原始碼剖析 對容器的特性和使用有了一點印象 我沒有經常應用,不敢說非常熟悉 網上有勤奮好學的前輩們總結的好文章 這兒 有一篇,是關於ma...

STL順序容器簡單應用

include include includeusing namespace std void main01 演算法和迭代器能無縫連線 int num1 count v1.begin v1.end 3 cout num1 endl 容器裝元素 class teacher void main02 容器...

CSS 容器和選擇器的簡單應用

選擇器 權重行內樣式 1000 id 100 class.10標籤1 通用 0 基本了解 容器標籤不具備任何特殊特殊作用,僅當作容器來使用 先介紹我學習到的兩個最基礎的容器 實踐 利用容器來達到如下的效果 居中標題 span p div body 在 head 標籤中使用 style 標籤,將所有標...