2015-01-12 2 views
4

Windsor Castle을 사용하여 해결 된 구성 요소의 처분 순서에 문제가 있습니다. 나는 다음과 같은 출력을 기대 Castle Windsor 처분 주문

 
Release done 
Dispose C2 
Dispose C1 
Dispose C2 
Container dispose done 

은 : C1 전에 C2를 폐기

 
Release done 
Dispose C1 
Dispose C2 
Container dispose done 

는 심각한 문제가 발생할 수있는 문제는 다음 코드

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WindsorContainer container = new WindsorContainer()) 
     { 
      container.Register(Component.For<C1>().LifestyleSingleton()); 
      container.Register(Component.For<C2>().LifestyleTransient()); 
      C1 c1 = container.Resolve<C1>(); 
      container.Release(c1); 
      Console.WriteLine("Release done"); 
     } 
     Console.WriteLine("Container dispose done"); 
    } 
} 

public class C1 : IDisposable 
{ 
    private C2 m_c2; 

    public C1(C2 c2) 
    { 
     m_c2 = c2; 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose C1"); 
    } 
} 

public class C2 : IDisposable 
{ 
    public void Dispose() 
    { 
     Console.WriteLine("Dispose C2"); 
    } 
} 

에 입증 할 수 그것은 다음과 같은 출력한다 C1. C1은 여전히 ​​살아 있고 뭔가를 처리 할 수 ​​있습니다. 두 구성 요소가 모두 LifestyleSingleton 또는 LifestyleTransient에 등록되었지만 LifestyleTransient로서의 C2 등록이 유용 할 수있는 경우가 여전히 존재하는 문제는 사라집니다.

이 문제를 해결하기 위해 구성 요소를 등록하거나 해결할 수있는 방법이 있습니까?

+2

[이 오래된 답변 Krzysztof 자신에 의해] (http://stackoverflow.com/a/3334449/1698557) 싱글 톤을 공개 실제로 아무것도하지 않습니다, 그래서 그 출력 진술은 아마 컨테이너의 처분에서 오는 . 그게 당신을 위해 무엇을 바꿔 놓았습니까? 이를 검증하기 위해'WriteLine' 호출을 더 추가 할 수 있습니다. –

+2

싱글 톤의 라이프 스타일을 가지고 뭔가 이상하게 여겨지는 것처럼 보입니다. 'C2'를 두 번, 한 번 (기본값) 일시적으로, 두 번째를 싱글 톤으로 등록 할 수 없으며, 'C1'을 싱글 톤 등록에 의존 할 수 있습니까? –

+1

명시 적으로 C1을 릴리스합니다. "살아있을 수 있고 무언가를 처리 할 수있다"는 것이 어떻게 가능할까요? 그것이 사실이라면 분명히 당신은 그것을 풀지 않았을 것입니다. –

답변

0

스코프를 사용하고 스코프 C1을 사용하여이 문제를 해결했습니다. 이 경우 처분 순서가 정확합니다. 그러나 이것이 권장되는 방법인지 확실하지 않습니다.