2012-03-06 3 views
5

Caliburn-Micro Silverlight 응용 프로그램에서 Castle-Windsor를 컨테이너로 사용하고 있습니다. 내 ViewModel 객체는 WCF 서비스 및 기타 여러 가지 요소를 호출 할 때 상당히 복잡합니다. 따라서 창이 닫히면 container.Release (viewModel)를 호출하여 Castle에서 전체 폐기/폐기 프로세스를 관리하고 구성된 다양한 수명주기 (this post에 설명 된대로)를 준수 할 수 있습니다.Caliburn Micro 및 Castle Windsor에서 ViewModels 처리

protected override object GetInstance(Type serviceType, string key) 
{ 
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType); 
    return container.Resolve(key, serviceType); 
} 

하지만 container.Release(viewModel)를 호출 깨끗한/우아한 방법을 마련하기 위해 고군분투하고있다 : 나는대로하는 GetInstance를 오버라이드 (override) 한 내 AppBootstrapper에서

은 다음과 같습니다. 이것에 사용할 갈고리가없는 것 같습니다.

Caliburn Micro 앱에서 ViewModelLocator에서 반환 된 ViewModel 객체를 해제하는 가장 간단한 방법은 무엇입니까?

답변

0

각 VM 유형에 대해 원하는 라이프 사이클이 여기에 영향을 미치므로 실제로 제공 한 컨텍스트에 대한 정답은 없습니다.

Screen CM의 기본 클래스는 시작하기에 좋은 장소 인 protected virtual void OnDeactivate(bool close);을 제공합니다. 헤비급 VM의 경우이 메서드를 재정의해야하며 close 매개 변수로 표시된 VM을 닫는 경우 처리해야 할 리소스 (WCF 채널 등)를 해제하십시오. 리소스를 삭제하는 것이 포함됩니다 (IDisposable이 해당하는 경우). 또한 GC에 의해 정리 될 수 있도록 모든 참조를 연결 해제하십시오.

캐슬을 사용하지 않기 때문에 라이프 사이클 구성 등의 측면에서 도움을 줄 수 없습니다. 그러나 위 내용을 따르는 경우 중량이 큰 물건을 들지 않을 것입니다. 올바른 수명주기 구성을 사용하면 Castle은 Release에 대한 명시 적 호출없이 다시 사용하지 않을 오래된 인스턴스를 정리합니다.

+0

대단히 감사합니다. @ 사이먼. OnDeactivate 경로를 후킹 할 장소로 탐구 했었습니다. 예, 생성자 매개 변수 목록이 긴 VM을 사용하는 경우 Castle은 해당 구성 요소 생성자의 모든 종속성을 충족시킵니다. 그런 다음 구성 요소가 Release()이면 Castle은 모든 종속성을 각자 구성된 라이프 스타일에 따라 릴리스합니다. 여기서 중요한 점은 Vms 자체가 모든 정리 작업에 대해 책임지지 않는다는 것입니다. 자동 작업입니다. –

+0

VM 자체에 대한 책임을 수행 할 수는 있지만 가능하다면 VM에서 수명주기 책임으로 오염되기 시작한다는 것을 의미합니다. 이상적으로 릴리스에 대한 책임은 Resolve에 책임이 있습니다. 즉 부트 스트 래퍼 또는 컨테이너 자체에서 호출 스택을 높게 설정하십시오. –

+0

예를 들어, VM 유형을 "일회용"의 라이프 사이클 (성에 매핑되는 것) 다음에 다음 번에 해당 유형의 인스턴스를 요청하면 컨테이너는 이미 사용 된 인스턴스이므로 사용 된 인스턴스를 릴리스해야합니다. 릴리스 할 명시 적 호출이 필요하지 않습니다. . –

관련 문제