给出以下构造函数签名:
public MyClass(Class1 arg1, params Class2[] arg2)
如何使用InjectionConstructor在Unity中注册MyClass并传入特定的命名类型。
我尝试了以下内容:
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构造函数解决了这个问题。有没有办法在不重载构造函数的情况下执行此操作?
答案 0 :(得分: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!这非常难看,但它可以解决你的问题。
答案 1 :(得分:1)
由于它似乎不喜欢直接列出的'Class2'实例,是否有可能将它们显式设置为数组(因此显式匹配Class1, Class2[]
的构造函数签名)将起作用:
unityContainer.RegisterType<IMyClass, MyClass>(new InjectionConstructor(typeof(Class1), new Class2[]{new ResolvedParameter<IClass2>("name1"), new ResolvedParameter<IClass2>("name2")}))