深入 Unity 1 x 依賴注入容器之一

2021-05-22 01:33:58 字數 1753 閱讀 1056

unity 是由微軟開發的乙個輕量級、可擴充套件的依賴注入(dependency injection, di)容器,支援建構函式、屬性和方法的依賴注入。所謂依賴的注入,即將程式開發過程中的物件與其所依賴的具體物件解耦,從一定程度上僅關注對所依賴物件 的使用,卻不管其具體物件是哪個類的例項;而真正的被依賴物件在執行時由容器注入。本質上,它就是乙個物件工廠和物件管理器。更詳細的資訊,請參見《ioc 容器和dependency injection 模式》。

unity 適用於可擴充套件、可插接的應用程式的開發,對於普通的、不要求插接的應用程式的開發反而會增加開發的複雜度。unity 的使用對效能也會有少量的影響 。

準備

unity 的初始化

unity 容器在使用前一般需要針對所使用的物件型別進行初始化,某些時候也可以不進行初始化。unity 容器的初始化主要是物件型別的註冊。這可以用二種方法完成,一是使用 .net **,另一種就是使用 xml 配置檔案。在 unity 文件的示例中,絕大多數的示例都是使用**的方法來對 untiy 進行初始化,這也給不少人造成了使用 unity 容器來管理物件比直接使用更複雜的錯覺。本文將同時使用**和 xml 配置檔案的方法來對初始化及其其他相關方面進行說明,以便大家對 unity 能有更全面、更正確的認識。

型別註冊

首先,在**檔案中新增對 microsoft.practices.unity 命名空間的引用。

執行結果如下:

下面,我們看看用 xml 如何來進行初始化。

首先,在配置檔案中,需要新增下列配置節宣告:

然後,配置型別註冊:

最後,我們可以用下列的方式來使用:

由上面的**我們可以看出,在完成 unity 的容器初始化後,使用的方法是一樣的。

建構函式注入

實質上,上面的示例我們可以用如下**來實現:

這二段**唯一的不同就是 38、39 行合併成了 52 這一行。這就是利用了建構函式注入。

在 telephone 類中,我們宣告了乙個  public telephone(idialer dialer) 的建構函式,而在 unity 容器中,已進行了用於 idialer 介面的註冊,所以在使用 unity 容器的 resolve 方法獲取物件時,就自動呼叫了此建構函式對物件進行了初始化。如果不存在這樣的建構函式,unity 容器將自動呼叫其預設建構函式進行初始化。

如果同時存在多個帶引數的建構函式,就需要用 [injectionconstructor] 特性來指定將使用的建構函式。

屬性注入

要使用屬性注入,我們需要在 telephone 類的 dialer 屬性上加上 [dependency] 特性宣告,如下所示:

同時,在配置檔案中加入如下配置以註冊 dialer 抽象類的對映:

這樣,建構函式注入中的示例**就依然是有效的,雖然建構函式已被注釋掉了。

方法呼叫注入

我們對 telephone 類做進一步的修改,注釋掉 [dependency] 特性,新增乙個 initialize 方法:

在 initialize 方法上,我們加上了 [injectionmethod] 以指出使用了方法呼叫注入的方法。這也使得在建構函式注入中所使用的示例**依然有效。

總結

unity 是乙個輕量級、可擴充套件的 di 容器,它可以用**或配置檔案來進行型別的註冊,同時支援建構函式注入、屬性注入和方法呼叫注入。

Unity筆記1 Unity簡介

unity 由unity technologies公司開發的用於建立遊戲和三維互動內容的開發工具,是乙個國際領先得專業遊戲引擎。具體應用如下 2d遊戲 視角完全鎖定,二維座標 3d遊戲 可以任意變化視角,無鎖定,三維座標 虛擬實境 vr 移動端頭顯裝置 外接式頭戴裝置 一體式頭戴裝置 xbox on...

Unity學習筆記 1 認識Unity

unity是patterns practices團隊開發的乙個輕量級 可擴充套件的依賴注入容器,具有如下的特性 它提供了建立 或者裝配 物件例項的機制,而這些物件例項可能還包含了其它被依賴的物件例項。unity允許將預先配置的物件注入到類中,實現了inversion of control ioc 的...

Unity開發 深入理解RectTransform

工作以後自己的時間被狠狠的壓縮,回家以後有時候也不太想思考技術性問題,思考了也不一定寫總結,所以呢,部落格更新起來比較慢,不過最近鑽研了很多問題,準備好好總結一下,陸續會把相關的內容發出來分享。言歸正傳,這篇主要說說recttransform這個在處理ui位置,形變繞不過的元件。新手在製作ui介面的...