6

次のコンストラクター シグネチャが与えられます。

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

InjectionConstructor を使用して特定の名前付きタイプを渡して MyClass を Unity に登録するにはどうすればよいですか。

私は次のことを試しました:

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

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 に答える