2009-02-23 2 views
6

, 나는이 과도 라이프 스타일 구성된 구성 요소 : 다음과 같이 사용됩니다캐슬 윈저 : 일시적인 구성 요소가 가비지 수집됩니까? 성 윈저를 사용

<component id="publish.mapping.default" 
        service="IMyService, MyAssembly" 
        type="MyServiceImplementation, Myassembly" 
        lifestyle="transient" /> 

:

var service = container.Resolve<IMyService>(componentId); 
// service usage .... 
// service goes out of scope ... 

내 질문은 서비스 인스턴스 쓰레기가 이후에 수집 된 것입니다 범위를 벗어나거나 캐슬 윈저가 참고로 붙잡을 것인가? 나는 this similar question을 발견했는데, 이것은 후자의 경우 일 수 있음을 의미한다. 그러나 거기에 게시 된 링크를 검토 한 후에, 참조가 계속 유지되고 있는지 또는 IDisposable을 구현할 경우 해당 객체가 폐기되었는지 확인하는 것이 확실하지 않다. 내 물건을 처분 할 필요가 없습니다.

Castle Windsor가 인스턴스를 유지하는 경우이를 방지 할 수있는 쉬운 방법이 있습니까?

수정
출시 추적 정책을 설정해야합니다. XML 구성 파일에서 구성 할 수 있습니까, 아니면 코드에서 설정해야합니까? 릴리스 추적 정책을 구성 요소별로 설정할 수 있습니까?

답변

9

기본적으로 컨테이너에는 객체 (일시적인 객체 포함)에 대한 참조가 있습니다.

그러나 @Bittercoder가 Why does Castle Windsor hold onto transient objects?에 기록한대로 change the release tracking policy을 사용할 수 있습니다. 질문이 질문 이후

var policy = container.Kernel.ReleasePolicy; 
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy; 

을하지만, 그 기본 정책이 될 것으로 보인다 :

LifecycledComponentsReleasePolicy 선택하는 것이 보인다.

+0

감사합니다. 구성 요소 단위로 구성 할 수 있는지 여부를 알고 있습니까? (내 질문에 편집 참조) – driis

+0

나는 그렇게 생각하지 않는다. 나는 실제로 Castle을 사용하지 않지만, 문서는 커널 전체를 제안하는 것처럼 보입니다. 이것이 올바른지 확실하지 않지만 구성 요소 유형에주의를 기울이는 사용자 지정 정책을 추가하는 것이 가능할 수 있습니다. –

+0

릴리스 정책의 설정은 컨테이너 폭입니다. 실제로 릴리스 정책 설정은 컨테이너 인스턴스를 작성한 후에 수행해야하는 첫 번째 작업 중 하나임을 지정하는 문서가 있습니다. 이 규칙을 따르지 않으면 특정 릴리스 정책을 사용하여 다른 구성 요소를 사용하여 일부 구성 요소가 만들어집니다. 이로 인해 메모리 누수가 발생할 확률이 높아질 수 있습니다. – Chai

1

주목할 점은 캐슬 트렁크에서 수정 된 것 같습니다. r5475에서 Hammett는 MicroKernel의 기본 릴리스 정책을 LifecycledComponentsReleasePolicy로 변경했습니다.

+0

소스를 확인하지 않았지만 리플렉터는 이것이 실제로 DefaultKernel 생성자에서 발생한다고 제안하는 것 같습니다. 알아두면 편리하게, 고마워! – Gavin

+0

그럼이게 무슨 뜻입니까? 누설이 일시적으로 문제가되어서는 안된다고? – Sinaesthetic