2013-06-04 18 views
39

Ninjectで既に作成されたクラスのインスタンスを登録して、注入が必要なたびにこのインスタンスを使用できるかどうかを教えてもらえますか?Ninject:すでに作成されたインスタンスをNinjectに登録しますか?

シングルトンと呼ぶことができますが、インスタンスがすでに作成されているとします。すべてのドキュメントは、クラスの新しいインスタンスを作成することを指しています。

+0

.InSingletonScope()と組み合わせて使用​​することができ、より複雑なものにしたい場合は、あなたがしているものです後に。単一のインスタンスを作成し、それを必要とするすべてのインスタンスにパンチします。 –

+3

ありがとうございますが、InSingleScopeはインスタンスを作成します。既にインスタンスがあります。かなりのプロパティで初期化されていますので、その特定のインスタンスを登録する必要があります。 – Martin

+0

依存グラフを作成する必要があります。オブジェクトを新しくするべきではないことを覚えておいてください。コンテナはアプリケーションを実行する前にそれらについてすべて知っている必要があります。オブジェクトを新しくしていて、あなたのアプリケーションの他の領域は、サービスロケータのような何らかのアンチパターンのように聞こえます。サービスロケータは、どこからでもカーネルからインスタンスを取得します。私が何かを誤解している場合を除き、私はごめんなさい: –

答えて

57

すでに存在するインスタンスを取り、シングルトンとして登録するメソッドToConstantを使用できます。

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToConstant(myClassInstance); 

あなたは(あなたがあなたのインスタンスを取得するためのFuncを使用することができる)ToMethodInSingletonScope

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToMethod(context => myClassInstance).InSingletonScope(); 
+1

ニース、いくつかのNinjectModuleでまだ作成されていないインスタンスをバインドしている状況がありますか?アプリケーションの開始時に何らかの理由でバインディングを実行できない場合や、どこで何かトリッキーを行う必要がある場合を除いて、私はちょっと変わっているようです。 .ToConstantは厳しい状況には役に立たないと思われます:) –

+0

こんにちはパトリック、私はオブジェクトのインスタンスをサードパーティのコンポーネントによってアプリケーションの開始点として与えられました。このインスタンスにはプロパティが設定されています。このオブジェクトまたはninjectモジュールを新しくしました。たとえそれがシングルトンであっても、私はすべての正しいプロパティを持っていないでしょう。しかし、私は助言するために開いている。私は現在、オブジェクトをninjectモジュールのコンストラクタに渡しています。これは、作成したninjectモジュールのコンストラクタに、nemjectをnemesvごとにインスタンスよりも登録するために使用しています。 – Martin

+2

これはあなたの問題を解決するはずですが、Martinはインスタンス化されたオブジェクトをどのように渡すかの良い例を与えてくれました:) –

関連する問題