2011-11-22 12 views
5

私はNinject(そして一般的にはDI)を使い慣れていません。初期化後のオブジェクト作成(Ninject)

は、私がどのようにカーネルをロード・モジュールを理解し、私がこれまでに書いたコードは、単一の行を持っている傾向がある:

私は私のモジュールに束縛から必要なすべてを構築する
myKernel.Get<MyApp>() 

。初期化後の新しいインスタンスの要件がある場合、これらは初期化のためにバインドするファクトリによって処理されます。これまでは、工場では、必要に応じてオブジェクトを新しくするだけで、どんなプロジェクト依存もなくなっていました。

私は、初期化後のオブジェクト作成について考える必要があり、私自身の工場パターンがそれ以上カットしていないという点に達しました。これは、(リモート)クライアント用のpub/subインターフェースをサポートすることになります。私のサーバーへの新しい接続のたびに、ninjectモジュールで定義されたバインディングのセットに従って新しいIClientインスタンスを作成したいと思います。これは、初期化時に渡される工場が独自のカーネル(またはメインカーネルへの参照)を持たなければならないことを意味しますか?どこにCommonServiceLocator機能がありますか? CSLは必要ですか?

私はあまりにも遠くを行き過ぎる前に、他の人がこの問題にどのように近づくかについてここで質問するのが最善であると思いました。

答えて

5

は、ファクトリインタフェースを作成し

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

Ninject 2.3についてはhttps://github.com/ninject/ninject.extensions.factoryを参照し、Ninjectによって以下の構成。

Bind<IClientFactory>().ToFactory(); 

2.2の場合は、実装を自分で行います。この実装はコンテナ構成の一部であり、実装の一部ではありません。

public class ClientFactory: IClientFactory 
{ 
    private IKernel kernel; 
    public ClientFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IClient CreateClient() 
    { 
     return this.kernel.Get<IClient>(); 
    } 
} 
+0

ありがとうございます。したがって、私が正しく理解していれば、2.3では、ファクトリインターフェイスの具体的な実装を作成することについて心配する必要はありませんか?実際の実装は、 'ToFactory()'呼び出しを使ってバインドされたときに何らかの形で発行されますか? – spender

+0

はい、動的プロキシを使用して自動的に実装されます –

+0

ニース。ご協力いただきありがとうございます。それは私の頭の中で多くの質問をクリアします。 – spender

1

それは私の要件を満たす可能性がある工場については、以下のパターンのようになります。私は、フォームのコンストラクタ持っ

Bind<Func<IClient>>().ToMethod(ctx =>() => ctx.Kernel.Get<ClientImpl>()); 

SomeCtor(Func<IClient> clientFactory, blah...) 
関連する問題