2011-01-26 2 views
0

Caliburn.Micro와 함께 Ninject를 사용하여 MVVM WCF Silverlight 앱을 만듭니다. 내가 가지고있는 문제는 내보기 모델의 수명주기입니다.ViewModel 불리지 않음

내보기 모델과 wcf 클라이언트를 바인딩하는 간단한 ninject 모듈을 만들었습니다. 내가 등록하고 WCF 이벤트와 일부 지방 관리되지 않는 참조를 드 등록 할 때문에 내 IIdCardViewModel에서

public class IDCardModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IIdCardManagerClient>().To<IdCardManagerClient>(); 
      Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>(); 
     } 
    } 

나는 그것이는 IDisposable에서 상속 요구했다.

그러나 Dispose는 절대로 호출되지 않습니다.

나는 다음과 같이 처리 호출하는 비활성화를 추가로 보았다 :

Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
       m => m.Dispose()); 

하지만 그 객체를 검색 내 IDCardModule에 두 가지, 언로드 재정의를 추가 할 저를 강요하고 그것을 발표 :

var releaseMe = this.Kernel.Get<IIdCardViewModel>(); 
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe); 

및 Load에서 내 바인딩 메서드에 .InThreadScope() 또는 .InSingletonScope() 중 하나를 사용합니다.

특정 개체에 대한 비활성화를 강제하는 쉬운 방법이 있습니까? 아니면 다른 IOC 프레임 워크를 조사해야합니까?

IStartable을 조사한 결과 비슷한 문제가있었습니다. 또한 나는 그가 활성화 블럭을 가지고 있고 using 문에서 모든 것을 감싸는 곳인 심도있는 Nate's article을 읽었다. 내 문제는 내 뷰 모델이 오래 실행 될 수 있으며 그의 솔루션이 여기에서 작동한다고 생각하지 않는다는 것입니다. 또한 GC.Collect를 잠자기하고 호출하는 특수 스레드를 사용하면 올바르게 냄새를 맡지 않습니다.

답변

0

루카스 B,

나는 이것이 당신하지만 난 내 개체가 너무 큰 메모리 사용에 대한 일부의 경우 선도 처리 문제가 있었다거야 도움이 경우 확실하지 않다. 이벤트 가입 문제였습니다. 이벤트에 가입 할 때마다 이벤트 완료 후 결코 구독을 취소하지 않았습니다. 내가 이해하는 한, 객체가 아직 이벤트에 가입하고 있다면 파괴되지 않습니다 ... 그렇게해야합니다 (- =).

게시자와 완전히 관련이 없더라도이 도움을 받으시기 바랍니다.