2

IDataContextによって実装されたインターフェイスがInMemoryDataContextありますMyApplicationDataContext。これは、次のように定義されBananaRepository : IBananaRepository、コンストラクターでデータ コンテキストを取るすべてのリポジトリによって消費されます。

interface IDataContext {}
class InMemoryDataContext : IDataContext {}
class MyApplicationDataContext : IDataContext {}

interface IBananaRepository {}
class BananaRepository : IBananaRepository 
{
    public BananaRepository(IDataContext dataContext) {}
}

これまでのところ、インターフェイスとサービスの利用者は ASP.NET MVC コントローラー、同期コマンド、およびクエリです。NInject は私の Web プロジェクトで構成されており、IDataContextにバインドされMyApplicationDataContextていInRequestScope()ます。

 kernel.Bind<IDataContext>().To<MyApplicationDataContext>().InRequestScope();
 kernel.Bind<IBananaRepository>().To<BananaRepository>();

プロジェクトの進化において、非同期処理 (コマンド、イベント + ハンドラーなど) の追加を開始したい段階に達しました。私が直面している問題は、一時的IDataContextなもの (毎回新しいもの) を取得する必要があるもののIDataContext、コントローラーの要求ごとにインスタンスのバインディングが既にセットアップされていることです。

DoSomethingAsyncCommandmyが新しいスレッドで実行される、次の単純なシナリオを考えてみましょう。

class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
    public DoSomethingAsyncCommand(IBananaRepository repository) {}

    public bool Execute(TArgs args) {}
}

NInjectが(および他のすべてのリポジトリ)のクラス実装をインスタンス化するときにIAsyncCommand、Webリクエストを再利用するためのインスタンスではなくIBananaRepository、の新しいインスタンスで初期化する必要があります(事実上、 myをとしてバインドしたい)IDataContextIAsyncCommandIDataContextInTransientScope()

どうやってやるの?

PS: IAsyncCommand インスタンスを直接インスタンス化するために、Ninject カーネルではなく CommonServiceLocator を使用しています。

4

1 に答える 1

2

https://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.csを見てください。

そこに IsAnyAnchestorNamed があります。同じループを使用して、 WhenInjectedInto で見つけた条件と組み合わせて、カスタム Whenから呼び出すことができます。

于 2012-04-19T12:40:48.847 に答える