InMemoryDataContext
とMyApplicationDataContext
によって実現されるIDataContext
インターフェイスを持っています。これはBananaRepository : IBananaRepository
のように定義されている私のリポジトリのすべてが消費し、そのコンストラクタでデータコンテキストを取るされていますNinjectと1より大きい深度のコンテキスト/条件依存性注入?
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
は新しいスレッドで実行されます。この簡単なシナリオを考えてみましょう:
class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}
public bool Execute(TArgs args) {}
}
NInjectがクラスIAsyncCommand
IBananaRepository
の実装(およびすべての私の他のリポジトリ)をインスタンス化するときに私はしたいと初期化します新しいIDataContext
のインスタンスではなく、再利用するためのWeb要求のための1(IAsyncCommand
私IDataContext
がInTransientScope()
として拘束されるのを効果的に私が欲しい)
私はそれをどのように行うことができますか?
P.S:IinyncCommandインスタンスを直接インスタンス化するために、NinjectカーネルではなくCommonServiceLocatorを使用しています。あなたがIsAnyAnchestorNamedを見つけることがありhttps://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.cs
で
単純な "kernel.Bind()。To ()。WhenInjectedInto ()。InTransientScope();"バインディングはできますか? –
Hari
@Hariいいえ、コマンドに含まれていないリポジトリにコンテキストが挿入されているためです。 –