と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
、コントローラーの要求ごとにインスタンスのバインディングが既にセットアップされていることです。
DoSomethingAsyncCommand
myが新しいスレッドで実行される、次の単純なシナリオを考えてみましょう。
class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}
public bool Execute(TArgs args) {}
}
NInjectが(および他のすべてのリポジトリ)のクラス実装をインスタンス化するときにIAsyncCommand
、Webリクエストを再利用するためのインスタンスではなくIBananaRepository
、の新しいインスタンスで初期化する必要があります(事実上、 myをとしてバインドしたい)IDataContext
IAsyncCommand
IDataContext
InTransientScope()
どうやってやるの?
PS: IAsyncCommand インスタンスを直接インスタンス化するために、Ninject カーネルではなく CommonServiceLocator を使用しています。