2012-01-24 4 views
4

특히, NInject를 사용하여 싱글 톤 범위에 바인딩 된 개체 묶음을 만드는 경우 NInject가 역순으로 해당 개체를 릴리스해야합니다.NInject2가 올바른 순서로 개체를 처분하도록하려면 어떻게해야합니까?

다음과 같은 테스트 사례가 있는데, 내가 잘못하고 있는지, NInject2에 버그가 있는지 알고 싶습니다.

내가 Foo의 인스턴스를 만든 다음 Bar의 인스턴스를 만든다면 NInject가 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 클라이언트 프로파일에서 NInject를 사용할 수 있도록 .NET 4.0에는 "no web"버전을 사용하고 있습니다.) – 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() 사용을 중단했으며 Bar의 범위에서 Foo를 정의 할 수 없기 때문에 상수에 사용하는 소수의 싱글 톤을 명시 적으로 리바 인딩합니다. 그런 스코프를 사용한다면, NInject가 의존성을 선언적으로 정의 할 수 없게 될 것입니다. (나는 관례에 기반한 바인딩을 사용한다.) – Arafangion

+0

실제로 모든 질문에 완벽하게 답변하고,이 작업을 고맙게 구현할 수 있어야한다. – Arafangion

관련 문제