2016-06-17 5 views
0

IOC 및 생성자 주입과 함께 루트 구성 패턴을 사용하는 WPF 응용 프로그램이 있습니다. View Models의 생성자에있는 대부분의 매개 변수는 리포지토리입니다. 리포지토리의 일부는 싱글 톤 라이프 스타일을 사용하여 캐싱하고 있습니다. 보기가 닫히 자마자 메모리를 해제하려면 모든보기 모델이 일시적입니다.성 Windsor IoC - Singleton/Transient 참조가있는 메모리 누수

그러나 일시적인보기 모델에서 단일 저장소에 대한 참조는 더 이상 사용되지 않으면 메모리에 유지되며 IOC 컨테이너가이를 해제하지 않도록 유지합니다.

더 이상 사용하지 않을 때 수업을 취소 할 수있는 패턴이 있습니까? ViewModels에 IDisposable을 구현하고 저장소 참조를 null로 설정하려고했지만 올바르게 작동하지 않습니다.

+0

싱글 톤에 대한 참조가있는 과도 상태가 좋습니다. 이것은 문제의 원인이 아닙니다. 메모리 누수를 피하려면 모든 Resolve()에 대해 일치하는 Release()가 있어야합니다. –

+0

동의. 내가보기의 닫힌 이벤트에 연결하고 이전에 해결했던 인스턴스를 릴리스했습니다. – Klaws86

답변

2

Castle Project의 커미터 중 하나의 블로그에 따르면이 과도 구성 요소의 수명에 더 잘 알려진 끝, 그리고 윈저 알 수 없기 때문에

Must I release everything when using Windsor?

과도 구성 요소, 풀과 유사하다 명시 적으로 (Release를 호출하여) 말하지 않는 한 컴포넌트를 사용할지 또는 사용하지 않을지를 결정합니다. 일시적인 구성 요소는 정의에 따라 공유되지 않으므로 Windsor는 구성 요소를 해제 할 때 즉시 제거합니다. 자신의 게시물의 또 다른 하나에 따르면

: 기본적으로

Must Windsor track my components?

윈저 자체가 어떤 서비스 해제의 우려가있는 객체를 추적합니다, 풀링, 또는 의존성의 추적한다.


지금 심각 - 종종 사람들은 윈저 (I 다음 게시물에 대한 얘기하자있는 부적절하게 사용하는 경우가 종종있다)는 메모리 누수로 생성하는 구성 요소에 보유하고 있음을 볼 수 그리고 그들은갑니다 - 윈저가 객체를 붙잡고 있으면 메모리 누수가 발생하므로 NoTrackingReleasePolicy를 사용하면 문제가 해결됩니다.

따라서 우리는 명시 적으로 해제하지 않는 한 Windsor가 거의 일시적인 및 풀링 된 개체에 대한 참조를 유지한다고 말할 수 있습니다.

문제에 대한 우아한 해결책은 응용 프로그램에서 더 이상 필요하지 않을 때보기 모델을 릴리스하기 위해 사용자 정의 LifestyleManager를 작성하는 것입니다.