2012-04-19 10 views
2

InMemoryDataContextMyApplicationDataContextによって実現される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プロジェクトで設定され、IDataContextMyApplicationDataContextInRequestScope()とバインドされています。

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がクラスIAsyncCommandIBananaRepositoryの実装(およびすべての私の他のリポジトリ)をインスタンス化するときに私はしたいと初期化します新しいIDataContextのインスタンスではなく、再利用するためのWeb要求のための1(IAsyncCommandIDataContextInTransientScope()として拘束されるのを効果的に私が欲しい)

私はそれをどのように行うことができますか?

P.S:IinyncCommandインスタンスを直接インスタンス化するために、NinjectカーネルではなくCommonServiceLocatorを使用しています。あなたがIsAnyAnchestorNamedを見つけることがありhttps://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.cs

+0

単純な "kernel.Bind ()。To ()。WhenInjectedInto ()。InTransientScope();"バインディングはできますか? – Hari

+0

@Hariいいえ、コマンドに含まれていないリポジトリにコンテキストが挿入されているためです。 –

答えて

2

ルック。同じループを使用して、WhenInjectedIntoで見つけた条件と組み合わせて、custom Whenから呼び出すことができます。

+0

ありがとうございます - 私は今日これを後で実装することを検討し、あなたと(この質問/回答)に戻ってきます。 –

+0

Hm。だから私はこの作品を作って、 'DoSomethingAsyncCommand(IRepo1 repo1、IRepo2 repo2)'を作成し、 'TransientScope'を使って2つの' IDataContext'インスタンスを作成することになります。それをどうやって回避するのですか? –

+0

データ・コンテキストがインスタンス化されているときにリポジトリへの参照もスコープ・オブジェクトとして使用するコマンドもないので、それは私だけ、あるいは私が考えていることはできませんか?私は自分のシナリオで工場を使う方が良いかもしれないと思いますか? –