インターフェイスを解決するときNinjectを構成シングルトンに解決しません

エイドリアン銀行:

私はそのDIのためにNinjectを使用するアプリケーションを持っています。私はいくつかの新しいクラスを追加しているし、彼らは私が彼らがあるべきだと思う方法では解決されていません。

私はクラスの持つFooインターフェイスを実装しますISomething私はこのようなバインディングを設定した場合:

kernel.Bind<Foo>().ToSelf().InSingletonScope();
kernel.Bind<ISomething>().To<Foo>();

その後、実行します。

var foo1 = kernel.Get<Foo>();
var foo2 = kernel.Get<ISomething>();

二つの変数が持っているさまざまのインスタンスFooクラスを。

私はバインドを変更する場合:

kernel.Bind<Foo>().ToSelf().InSingletonScope();
kernel.Bind<ISomething>().ToMethod(ctx => ctx.Kernel.Get<Foo>());

その後、実行します。

var foo1 = kernel.Get<Foo>();
var foo2 = kernel.Get<ISomething>();

二つの変数が持っている同じインスタンスを。

私の理解では、最初のケースでは、それは解決すべきことであるISomethingFoo自身のシングルトンにターン解決では、その意志を。間違って私の理解である、または他の何かが間違っていますか?手動でそれを解決する必要がビット冗長です。

スティーブン:

あなたが登録してライフスタイルを省略した場合は、慣例により、Ninjectは過渡的なライフスタイルを使用しています。これは、これを:

kernel.Bind<ISomething>().To<Foo>();

と同等です。

kernel.Bind<ISomething>().To<Foo>().InTransientScope();

ライフスタイルを加えると、それは問題を発見しやすくなります。

kernel.Bind<Foo>().ToSelf().InSingletonScope();
kernel.Bind<ISomething>().To<Foo>().InTransientScope();

あるいはより明確に:

kernel.Bind<Foo>()       .To<Foo>().InSingletonScope();
kernel.Bind<ISomething>().To<Foo>().InTransientScope();

ここでは、あなたが登録していることがわかりFooシングルトンと過渡の両方として。この設定ミスと呼ばれる共通の落とし穴であるあいまいなライフスタイル

さまざまなライフスタイルを持つ複数の登録が同一の構成要素にマッピングすると、コンポーネントがあいまいなライフスタイルを持っていると言われています。複数のライフスタイルを持つ1つのコンポーネントを持つことは、そのコンポーネントのインスタンスは異なる方法でキャッシュされることになりますと、これはあなたが期待していないかもしれない行動につながることができます。

いくつかのDIコンテナは、私はあなたが誤って設定ミスを犯し、コンテナ、このようにできるように行うに精通だとあなたが設定ミスのこの種を検出するために使用できることを検証メカニズムが含まれていませんが、すべてのDIコンテナ。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377903&siteId=1