5

私は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番目の部分は機能しません。

4

1 に答える 1

1

最初の質問には悪くありません!

オーバーロードを使用してBind(Type)、コードのコンテキストで静的に利用できないものを登録できるようにLoad()します。プロバイダーで実行していること(つまり、を解決することType)を事前に実行します。これにより、Ninjectはオブジェクトのインスタンス化を実行できます(デフォルトの.ctorは必要ありません)。

私の最近の回答のIIRC2または3も、この発見/読み込みに関するものに触れており、あなたのケースに関連するはずの例があります。

[Inject](そして、物事を削除するようになったときに属性に頼る必要はありません)

于 2010-09-23T22:46:06.187 に答える