私はこのクラスを持っています:
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に渡すにはどうすればよいですか?
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は例外を発生させます。
次のようにタイプを登録してみてください。
<register type="IRepo" mapTo="Repo">
<constructor />
</register>
param
要素にconstructor
要素が指定されていないため、デフォルトのコンストラクターを呼び出す必要があります。
この登録はコードで行うこともできます:
container.RegisterType<IRepo, Repo>(new InjectionConstructor());