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 등록이 유용 할 수있는 경우가 여전히 존재하는 문제는 사라집니다.
이 문제를 해결하기 위해 구성 요소를 등록하거나 해결할 수있는 방법이 있습니까?
[이 오래된 답변 Krzysztof 자신에 의해] (http://stackoverflow.com/a/3334449/1698557) 싱글 톤을 공개 실제로 아무것도하지 않습니다, 그래서 그 출력 진술은 아마 컨테이너의 처분에서 오는 . 그게 당신을 위해 무엇을 바꿔 놓았습니까? 이를 검증하기 위해'WriteLine' 호출을 더 추가 할 수 있습니다. –
싱글 톤의 라이프 스타일을 가지고 뭔가 이상하게 여겨지는 것처럼 보입니다. 'C2'를 두 번, 한 번 (기본값) 일시적으로, 두 번째를 싱글 톤으로 등록 할 수 없으며, 'C1'을 싱글 톤 등록에 의존 할 수 있습니까? –
명시 적으로 C1을 릴리스합니다. "살아있을 수 있고 무언가를 처리 할 수있다"는 것이 어떻게 가능할까요? 그것이 사실이라면 분명히 당신은 그것을 풀지 않았을 것입니다. –