2013-02-27 18 views
1

我試圖用統一註冊依賴和值傳遞給構造函數,使用下面團結InjectionConstructor傳遞對象數組

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(new Pharmacy {SiteId = 2,DistrictCode = "2"})); 

的代碼,但我得到

「的類型OrderService.Business。 MockOrderServiceProviderContext確實 沒有帶參數的構造函數(Pharmacy)。「

構造函數。

public MockOrderServiceProviderContext(params object[] objects) 
    { 
     _object = objects; 
    } 

如何傳遞對象數組的構造函數值?

感謝

回答

4

的params關鍵字是傳遞的參數數組語法糖相匹配。

下面的方法:

public void MyMethod(params object[] args) 
{ 
} 

可以在兩個具有相同的結果通過以下方式調用:

MyMethod(new object(), new object()); 
MyMethod(new []{ new object(), new object()); 

當團結查找構造函數,它看到一個構造函數的一個參數鍵入object[]。所以Unity提供的值必須是一個數組。

InjectionConstructor也使用了params關鍵字,其中每個參數都是一個值,以轉發給您自己的構造函數。如果使用數組實例化InjectionConstructor,它將嘗試使用數組中的每個元素並將它們轉發給您的類構造函數。

爲了避免這種情況,我們需要兩個級別的包裝,一個用於統一爲您的課程提供數組,另一個用於使InjectionConstructor使用第一個數組作爲第一個也是唯一的參數。

所以,你應該使用下列內容:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new [] 
    { 
     new [] 
     { 
      new Pharmacy { SiteId = 2, DistrictCode = "2" } 
     } 
    })); 

如果你想要更多的項目獲得通過,只是將它們添加到內部陣列:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new [] 
    { 
     new [] 
     { 
      new Pharmacy { SiteId = 2, DistrictCode = "2" }, 
      new Hospital { SiteId = 5, DistrictCode="2" } 
     } 
    })); 
+0

感謝關於params和injectionconstructor的解釋 – JoR 2013-03-01 14:29:41

+0

@JoR沒問題,我希望它有道理 – Lukazoid 2013-03-01 14:32:34

+0

非常有幫助的解釋,甚至3年後! – brazilianldsjaguar 2016-07-09 00:27:22

-1

糾正我,如果我錯了,但不是你想給你的MockOrderServiceProviderContext一個paramater這是不是一個數組?

您將new InjectionConstructor(..)作爲參數替代,或者object如果您想這樣說,而不是object[]

+0

其實也沒什麼。擁有對象數組的想法是我們可以傳遞多個對象。就像''新的藥房{SiteId = 2,DistrictCode =「2」},新的醫院{ID = 1,name =「SSS」}'謝謝 – JoR 2013-02-27 15:43:53

+0

@joetjah在註冊Unity時,'InjectionConstructor'的參數是用於確定注入值時的參數,'InjectionConstructor'實際上並未用作參數值 – Lukazoid 2013-02-28 22:34:48

2

這就是我如何得到它的工作。

你要的對象添加到一個數組,然後將它們添加到容器陣列,使其與構造函數參數簽名

var objAr = new object[2]; 
objAr[0] = new Pharmacy { SiteId = 3, DistrictCode = "2" }; 
objAr[1] = new Facility { SiteID = 1, FacilityCode="Facility" }; 

//Add the object array to another container array so that Unity Injection constructor can match the constructor. 
var containerArray = new object[1]; 
containerArray[0] = objAr; 

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(containerArray));