2012-12-07 39 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

相关问题