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 객체를 해제하는 가장 간단한 방법은 무엇입니까?
대단히 감사합니다. @ 사이먼. OnDeactivate 경로를 후킹 할 장소로 탐구 했었습니다. 예, 생성자 매개 변수 목록이 긴 VM을 사용하는 경우 Castle은 해당 구성 요소 생성자의 모든 종속성을 충족시킵니다. 그런 다음 구성 요소가 Release()이면 Castle은 모든 종속성을 각자 구성된 라이프 스타일에 따라 릴리스합니다. 여기서 중요한 점은 Vms 자체가 모든 정리 작업에 대해 책임지지 않는다는 것입니다. 자동 작업입니다. –
VM 자체에 대한 책임을 수행 할 수는 있지만 가능하다면 VM에서 수명주기 책임으로 오염되기 시작한다는 것을 의미합니다. 이상적으로 릴리스에 대한 책임은 Resolve에 책임이 있습니다. 즉 부트 스트 래퍼 또는 컨테이너 자체에서 호출 스택을 높게 설정하십시오. –
예를 들어, VM 유형을 "일회용"의 라이프 사이클 (성에 매핑되는 것) 다음에 다음 번에 해당 유형의 인스턴스를 요청하면 컨테이너는 이미 사용 된 인스턴스이므로 사용 된 인스턴스를 릴리스해야합니다. 릴리스 할 명시 적 호출이 필요하지 않습니다. . –