2012-01-24 7 views
4

具体的には、NInjectを使用してシングルトンスコープでバインドされたオブジェクトの束を作成すると、NInjectがそれらを逆の順序で解放することが期待されます。NInject2が正しい順序でオブジェクトを廃棄するようにするにはどうすればよいですか?

私は次のようなテストケースを持っています。何か間違っているのか、NInject2にバグがあるのか​​を知りたいのです。

私はFooのインスタンスを作成し、次にBarのインスタンスを作成したので、NoojectはFooをリリースする前にBarを解放する必要があります。なぜこれをやっていないのですか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Ninject; 

namespace ConsoleApplication1 
{ 
    interface IFoo 
    { 
    } 

    interface IBar 
    { 
    } 

    class Foo : IFoo, IDisposable 
    { 
     public Foo() 
     { 
      System.Console.WriteLine("Created Foo Instance"); 
     } 
     public void Dispose() 
     { 
      System.Console.WriteLine("Disposed Foo Instance"); 
     } 
    } 

    class Bar : IBar, IDisposable 
    { 
     public Bar(IFoo foo) 
     { 
      System.Console.WriteLine("Created Bar Instance"); 
     } 
     public void Dispose() 
     { 
      System.Console.WriteLine("Disposed Bar Instance"); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var kernel = new Ninject.StandardKernel()) 
      { 
       kernel.Bind<IBar>().To<Bar>().InSingletonScope(); 
       kernel.Bind<IFoo>().To<Foo>().InSingletonScope(); 

       kernel.Get<IFoo>(); 
       kernel.Get<IBar>(); 
      } 
     } 
    } 
} 

実際の出力:

Created Foo Instance 
Created Bar Instance 
Disposed Foo Instance 
Disposed Bar Instance 

予想される出力:

Created Foo Instance 
Created Bar Instance 
Disposed Bar Instance 
Disposed Foo Instance 
+0

(ちなみに、.NET 4.0では「no web」バージョンを使用していますので、.NET 4.0 Client ProfileでNInjectを使用できます) – Arafangion

答えて

3

Ninjectは、現時点では、参照カウントを持っていません。したがって、インスタンスは任意の順序で配置されます。これを望むなら、参照カウントを持つICache実装を書かなければならないでしょう。

また、名前付きスコープを使用してFooがBarのスコープ内にあることを定義することもできます。これにより、FooはBarの前に処分されません。

+0

これを行うには参照カウントは必要ありません。作成した各アイテムをリストに追加します。そして、それらを逆の順序で破棄します。参照カウントは、解決するよりも多くの問題を追加するでしょう。つまり、https://github.com/ninject/ninject/blob/master/src/Ninject/Activation/Caching/ICache.csを見ると、これは実装が非常に簡単なようですが、どうすればよいのでしょうか私自身のためにNInjectの実装を置き換えることについて? – Arafangion

+0

今は、.InSingletonScope()の使用を中止し、バーのスコープ内でFooを定義することができないため、定数に使用するいくつかの真のシングルトンを明示的に再バインドします。このようなスコープを使用した場合、依存関係を宣言的に定義するNInjectの能力が欠けてしまいます。 (私は慣例に基づいた拘束を使用しています) – Arafangion

+0

すべてが実際に問題に完全に答えるので、私は仕事でこの背中を実装することができるはずです(ありがとう! – Arafangion

関連する問題