3

現在、オブジェクトの非同期初期化に関する問題に直面しています (この質問)。私はNinject 3.0.1.10を使用していますが、次のことを達成したいと考えています:

Kernel.Bind<IServiceProvider>().ToMethod(async ctx => await ServiceProvider.CreateAsync())

非同期ラムダ式は ではなく を返すため、これはコンパイルされませTask<ServiceProvider>ServiceProvider。Ninjectでオブジェクトを非同期に初期化する方法はありますか? 多分いくつかの回避策?

4

1 に答える 1

0

ご要望に応じて、ninject を使用するソリューションを掲載しています。コンストラクターは初期化を実行していませんが、メソッドは実行しているため、私はあなたの目標から少し逸脱しました。メソッドはインターセプターによって呼び出されます。Async-Ctor は、「ターゲットのないインターフェイス プロキシ」 ( http://docs.castleproject.org/Tools.Kinds-of-proxy-objects.ashxを参照) に変更し、インターセプターにオブジェクトをインスタンス化させることで可能になる可能性が最も高いです。

また、非同期初期化はおそらくメリットよりもデメリットの方が多いと思います。たとえば、インターフェイスでの呼び出しによって初期化例外が発生する可能性があるため、初期化例外の処理が困難になります。

キャッスル ダイナミック プロキシ + ターゲットの非同期を初期化するインターセプター

IFooにバインドされていInterceptingProxyProvider : IProviderます。プロバイダはFoo、 のすべてのインターセプタをインスタンス化Fooし、キャッスル ダイナミック プロキシ ( Proxy) を作成して返します。これは、が注入されているCallerときに受け取るものです。コンストラクターでのIFoo初期AsyncInitializationInterceptor化を開始します。Foo最初に傍受された呼び出しで、初期化が完了するのを待ってから続行します。初期化が例外で失敗した場合、以降のすべてのアクセスIFooで初期化例外がスローされます。

さらに、ninject プロキシ拡張機能は、ターゲット タイプごとにインターセプター インスタンスを作成します。ただし、必要なのは、ターゲット インスタンスごとに 1 つのインターセプター インスタンスです。これが、プロキシとインターセプターのバインディングとインスタンス化のカスタム実装を提供した理由です。

これがコードで、使用方法を示す統合テストが完了しています。

于 2013-10-02T13:59:59.227 に答える