私はNinjectにかなり慣れていませんが、カスタムプロバイダーを使用してDIに使用することに成功しました。
バインディングは次のように初期化されます
kernel = new StandardKernel();
kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();
カスタムプロバイダーでは、Activator.CreateInstanceを次のように呼び出します
protected override IPatientRecordLocator CreateInstance(IContext context)
{
var name = ConfigurationManager.AppSettings["PatientRecordLocator"];
var typeName = name.Split(',')[0];
var assemblyName = name.Split(',')[1];
return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator;
}
(はい、上記のコードにはエラー処理などがないことを認識しています:))
そして、これはすべて魅力のように機能します。
今、私が直面している問題は、IPatientRecordLocatorのインスタンスに注入したい新しいクラスを導入するときです。これらのクラスの1つに次のようなコンストラクターを追加すると、問題が発生します
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}
次に、Activator.CreateInstanceを機能させるには、パラメーターのないコンストラクターをクラスMockPatientRecordLocatorに追加する必要があります。
public MockPatientRecordLocator()
{
}
だから、私の質問は、NinjectにIContactAdapterを実装するクラスのインスタンスをMockPatientRecordLocatorなどに注入させるにはどうすればよいですか?メソッドインジェクションを試しましたが、役に立ちませんでした。
私が達成しようとしているのは、クラスPatientRecordSummaryのインスタンスにMockPatientRecordLocatorのインスタンスが注入され(コンストラクター注入を使用)、MockPatientRecordLocatorのインスタンスにIContactAdapterのインスタンスが注入されるという一種の連鎖注入であることを説明するのを忘れました(再びコンストラクタインジェクションを使用します(可能な場合))。チェーンの最初の部分は機能しますが、2番目の部分は機能しません。