介紹了使用unitycontainer來註冊物件之間的關係、註冊已存在的物件之間的關係,同時著重介紹了unity內建的各種生命週期管理器的使用方法,今天則主要介紹unity的register和resolve的一些高階應用。
1、註冊型別同時初始化構造函式引數並過載呼叫。一、註冊型別同時初始化構造函式引數並過載呼叫我們在使用unity中註冊物件之間的關係時,可能物件有相應的建構函式,建構函式中需要傳遞相應的引數,unity就支援這樣的註冊,其主要靠injectionconstructor這個類來完成,我們首先來看下具體的類建構函式:2、註冊型別同時初始化屬性引數並過載呼叫。
3、延遲獲取物件。
4、檢索檢索容器中註冊資訊。
public yourclass(string test, myclass my)
這個建構函式有2個引數,乙個字串和乙個myclass類物件,相應的可以使用如下**進行註冊:
//由於所註冊的物件的有帶有引數的建構函式,所以註冊型別時需要提供相應的引數
//這邊採用injectionconstructor這個類來實現
container.registertype(
new injectionconstructor("a", new myclass()));
console.writeline("-----------預設呼叫輸出-------------");
container.resolve();
這樣既可完成物件註冊的同時對構造函式引數進行注入,此時還有另外乙個需求,就是雖然在註冊的時候已經對構造函式引數進行了初始化,但是在呼叫的時候我們想更換原先註冊的值,這時應該怎麼辦?
在unity中,已經幫我們解決了這個問題,我們可以通過parameteroverride和parameteroverrides來實現,其中parameteroverride是針對乙個引數,而parameteroverrides是針對引數列表,有關註冊引數初始化及引數過載的全部**如下:
public static void resolveparameter()
,
}.ontype());
}
其中需要注意的是:
1、在使用parameteroverride方法來過載引數時,如果註冊的引數是乙個具體的物件就需要使用ontype這個擴充套件方法來指定對應的型別,否則會報錯。效果圖如下:2、在使用parameteroverrides進行過載引數時,可以使用如上面**的方式進行指定,但是同樣需要使用ontype來指定,不過這個的ontype指定的型別是註冊的物件型別。
可以看出,其中第乙個字串引數在過載後呼叫時已經發生了更改。
二、註冊型別同時初始化屬性並過載呼叫
這個初始化屬性和上面的初始化引數很類似,只不過不同的是,屬性的註冊初始化是使用injectionproperty,而過載屬性是使用的propertyoverride和propertyoverrides,其使用方法也是相同的,這邊就不多介紹了,**如下:
public static void resolveproperty()
,
}.ontype());
console.writeline(myclass.name);
console.writeline(myclass.description);
}
效果圖如下:
可以看到2個屬性都已經被過載了。
unity還為我們提供了乙個dependencyoverride過載,其使用方法和引數過載、屬性過載類似,這邊就不演示了,不過需要注意的是dependencyoverride是針對所註冊物件型別中所包含的物件型別過載,例如在a類中有構造函式引數是b類,同時也有個屬性依賴於b類,當使用了dependencyoverride後,這個a物件原先註冊的有關b類的依賴將全部改變。(具體可檢視示例**中的resolvedependency)
三、延遲獲取物件
unity還有個很不錯的特性就是支援延遲獲取, 其本質是通過事先建立乙個委託,然後再呼叫這個委託,看下下面的**:
public static void deferringresolve()
這段**演示了2個延遲獲取的方式,都是通過將func放入resolve中來實現的,返回的是一委託,這樣就可以在實際需要的時候再呼叫這個委託:
1、第一種是事先通過resolve>(); 來定義獲取與iclass關聯的物件的委託,然後再註冊iclass與myclass之間的關係,然後再通過resolver(); 來獲取。四、檢索容器中註冊資訊當我們在不斷使用unity容器的過程中,我們有時候想看一下容器中到底註冊了多少物件,以及各個物件的一些資訊,如:什麼物件和什麼物件關聯、具體的註冊名稱和使用的生命週期管理器,這些資訊都可以在容器的registrations屬性中檢視到,在unity文件中已經有個方法來檢視這些資訊了,**如下:2、第二種是事先通過resolve>>(); 來定義獲取乙個與iclass關聯的命名例項列表的委託,然後呼叫相應的委託就可以一次性獲取與iclass關聯的所有命名例項。
這2種方式都很好的展示了unity可以更加靈活的控制物件之間的註冊與物件的呼叫。
public static void displaycontainerregistrations(iunitycontainer thecontainer)
個註冊資訊:",
thecontainer.registrations.count());
foreach (containerregistration item in thecontainer.registrations)
else
lifetime = lifetime.substring(0, lifetime.length - "生命週期管理器".length);
console.writeline("+ '' ", regtype, mapto, regname, lifetime);}}
具體的註冊**如下:
public static void registerall()
效果圖如下:
可以看到,我在**中註冊的資訊都已經很好的反應出來了。
同時如果想檢視某個物件是否已經被註冊,可以通過container.isregistered來驗證,這邊就不演示了。
以上就是本文的所有內容了,主要介紹了unity的register和resolve的一些高階應用,英文好的朋友可以直接檢視unity的官方文件。
(注意:本文示例**是基於vs2010+unity2.0,所以請使用vs2010開啟,如果沒有安裝vs2010,請將相關**複製到相應的vs中執行既可)
Unity 指定引數
構造函式引數初始化 injectionconstructor icontainer.registertype new injectionconstructor param1 new class 註冊的時候已經對構造函式引數進行了初始化,呼叫的時候我們想更換原先註冊的值 parameteroverri...
Unity呼叫AssetBundle資源
我的unity版本是基於unity5.3.4,主要實現功能是 打包assetbundle檔案 載入這些assetbundle檔案。1.1 場景模型,製作成prefab,設定prefab的assetbundle型別 檔案字尾名,比如說 modelbundle型別 unity3d 如果有大量的模型需要新...
函式呼叫符過載
經常見到 std accumulate numbers,numbers 3,init,std minus 這種使用方法 1 其實,std minus 還是表示乙個函式 minus.operator 2 std minus 是乙個類,不是乙個物件,std minus 其實是呼叫的建構函式 也就是說,這...