2012-12-07 41 views
6

考慮下面的構造簽名:使用Unity註冊類型使用構造函數需要參數數組

public MyClass(Class1 arg1, params Class2[] arg2) 

如何註冊MyClass的使用Unity傳遞特定命名的類型使用InjectionConstructor。

我已經試過如下:

unityContainer.RegisterType<IMyClass, MyClass>(new InjectionConstructor(typeof(Class1), new ResolvedParameter<IClass2>("name1"), new ResolvedParameter<IClass2>("name2"))) 

但得到一個異常說是有與無簽名構造:

public MyClass(Class1 arg1, Class2 arg2, Class2 arg3) 

我已經通過重載MyClass的構造得到全面的問題。有沒有辦法做到這一點,而不會重載構造函數?

回答

6

爲什麼你會首先嚐試使用InjectionConstructor? Unity知道如何處理開箱即用的陣列。

params關鍵字只是編譯器的一些語法糖。封面args2只是一個簡單的數組。

[TestMethod] 
public void TestMethod1() 
{ 
    var container = new UnityContainer(); 
    // if you absolutely have to use an InjectionConstructor this should do the trick 
    // container.RegisterType<IMyClass, MyClass>(
    // new InjectionConstructor(typeof(Class1), typeof(Class2[]))); 
    container.RegisterType<IMyClass, MyClass>(
    new InjectionConstructor(typeof(Class1), typeof(Class2[]))); 
    container.RegisterType<Class2>("1"); 
    container.RegisterType<Class2>("2"); 
    container.RegisterType<Class2>("3"); 
    var myClass = container.Resolve<IMyClass>() as MyClass; 
    Assert.IsNotNull(myClass); 
    Assert.IsNotNull(myClass.Arg2); 
    Assert.AreEqual(3, myClass.Arg2.Length); 
} 

interface IMyClass 
{ 
} 
class MyClass : IMyClass 
{ 
    public Class1 Arg1 { get; set; } 
    public Class2[] Arg2 { get; set; } 
    public MyClass(Class1 arg1, params Class2[] arg2) 
    { 
    Arg1 = arg1; 
    Arg2 = arg2; 
    } 
} 
class Class1 
{ 
} 
class Class2 
{ 
} 

更新

如果你只使用一些指定的註冊,你將不得不使用ResolvedArrayParameter

container.RegisterType<IMyClass, MyClass>(
    new InjectionConstructor(
    typeof(Class1), 
    new ResolvedArrayParameter<Class2>(
     new ResolvedParameter<Class2>("1"), 
     new ResolvedParameter<Class2>("2")))); 

Brrr!這是超級醜陋的,但它應該可以解決你的問題。

+0

謝謝。我正在使用注入構造函數,因爲我有幾個IClass2的實現,我只是將其中的一些傳遞給MyClass構造函數。如果有更好的方法來做到這一點,請告訴我! – macleojw

+0

@macleojw請參閱我的更新。 –

1

因爲它似乎不喜歡簡單地直接列出的「等級2」的情況下,是有可能,明確地將它們設置成一個陣列(和因而明確地匹配的Class1, Class2[]構造簽名)將工作:

unityContainer.RegisterType<IMyClass, MyClass>(new InjectionConstructor(typeof(Class1), new Class2[]{new ResolvedParameter<IClass2>("name1"), new ResolvedParameter<IClass2>("name2")})) 
+0

恐怕不起作用,因爲該數組聲明的類型爲Class2,但它正在初始化的對象的類型爲ResolvedParameter。如果我從數組定義中刪除對象類型(即new [] {...}),那麼它會查找一個構造函數,並獲取ResolvedParameters數組! – macleojw

相關問題