6

给定以下构造函数签名:

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 构造函数解决了这个问题。有没有办法在不重载构造函数的情况下做到这一点?

4

2 回答 2

6

你为什么要首先尝试使用 an 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"))));

呸!这非常难看,但它应该可以解决您的问题。

于 2012-12-07T12:46:49.310 回答
1

由于它似乎不喜欢简单地直接列出“Class2”实例,因此是否有可能将它们显式设置为数组(并因此显式匹配 的构造函数签名Class1, Class2[])会起作用:

unityContainer.RegisterType<IMyClass, MyClass>(new InjectionConstructor(typeof(Class1), new Class2[]{new ResolvedParameter<IClass2>("name1"), new ResolvedParameter<IClass2>("name2")}))
于 2012-12-07T12:26:11.720 回答