web-dev-qa-db-ja.com

Unityはクラスのデフォルトコンストラクターを使用していません

私はこのクラスを持っています:

public class Repo
{
   public Repo() : this(ConfigurationManager.AppSettings["identity"],       ConfigurationManager.AppSettings["password"])

    {

    }

   public Repo(string identity,string password)
   {
       //Initialize properties.
   }

}

このタイプがUnityコンテナーによって自動的に構築されるように、web.configに行を追加しました。

しかし、アプリケーションの実行中に、次のエラーメッセージが表示されます。

  "System.InvalidOperationException : the parameter identity could not be resolved when attempting to call constructor Repo(String identity, String password)  -->Microsoft.Practices.ObjectBuilder2.BuildFailedException : The current Build operation ...."

1)Unityがデフォルトのコンストラクターを使用しないのはなぜですか?

2)Unityで2番目のコンストラクター(パラメーター化されたコンストラクター)を使用したいとします。構成ファイルを介してその情報をUnityに渡すにはどうすればよいですか?

21
Attilah

Unityはデフォルトで、最も多くのパラメーターを持つコンストラクターを選択します。 Unityに別のものを明示的に使用するように指示する必要があります。

これを行う1つの方法は、次のような[InjectionConstructor]属性を使用することです。

using Microsoft.Practices.Unity;

public class Repo
{
   [InjectionConstructor]
   public Repo() : this(ConfigurationManager.AppSettings["identity"], ConfigurationManager.AppSettings["password"])
   {

   }

   public Repo(string identity,string password)
   {
       //Initialize properties.
   }
}

これを行う2番目の方法は、クラス/メソッドを属性で乱雑にするのではなく、 InjectionConstructor を使用してコンテナーを構成するときに使用するコンストラクターを指定することです。

IUnityContainer container = new UnityContainer();
container.RegisterType<Repo>(new InjectionConstructor());

ドキュメント から:

Unityがターゲットコンストラクターとパラメーターを解決する方法

ターゲットクラスに複数のコンストラクターが含まれている場合、UnityはInjectionConstructor属性が適用されているコンストラクターを使用します。複数のコンストラクターがあり、InjectionConstructor属性を持っているコンストラクターがない場合、Unityは最も多くのパラメーターを持つコンストラクターを使用します。そのようなコンストラクターが複数ある場合(同じ数のパラメーターを持つ「最長」のものが複数ある場合)、Unityは例外を発生させます。

57

次のようにタイプを登録してみてください。

<register type="IRepo" mapTo="Repo">
  <constructor />
</register>

param要素にconstructor要素が指定されていないため、デフォルトのコンストラクターを呼び出す必要があります。

この登録はコードで行うこともできます:

container.RegisterType<IRepo, Repo>(new InjectionConstructor());
23
Ladislav Mrnka