있습니다프리즘보기가 다음과 같은 코드를 마이크로 소프트의보기 주입 샘플/기사에서는 사출 발표자 및 쓰레기 수거
public void Initialize()
{
this.RegisterViewsAndServices();
EmployeesPresenter presenter = this.container.Resolve<EmployeesPresenter>();
IRegion mainRegion = this.regionManager.Regions[RegionNames.MainRegion];
mainRegion.Add(presenter.View);
}
http://msdn.microsoft.com/en-us/library/dd458920.aspx
여기 발표자 유형 IEmployeesView의 공공 재산을 포함하는 해결되고 그 지역에보기를 주입하는데 사용되는 것들. 발표자를 해결하는 이점은보기에 자동으로 연결된다는 것입니다 (단결을 통해 생성자에서 가져옴). 그러나 초기화 메서드의 범위가 끝난 후에 발표자에 대한 참조가 없으므로 발표자가 가비지 수집을하는 경향이 있다고 생각하지 않습니까?
VM/View에 발표자가 구독하는 이벤트가 없다면 ViewModel은 분명히 발표자를 언급하지 않습니다. 우리는보기가 활성화되어 있지만 발표자가 가비지 수집되는 일관성없는 상태로 갈 수 있습니다.
발표자의 가비지 수집을 방지하려면 ViewModel에서 GC를 막기 위해 발표자에 대한 참조를 보유하고 있지만 해커처럼 들리 네요. 이 상황에서 당신은 무엇을합니까?
보기의 인스턴스가 여러 개인 경우 Presenter를 ContainerControlledLifetimeManager에 등록하는 것이 적합하지 않습니다. 또한 프리젠터 (보기 포함)에 대한 통신 모드가 명령을 통해 이루어지고 명령이 프리즘의 DelegateCommands 일 경우 프리젠 테이션에 대한 약한 참조 만 유지하므로 목적을 달성하지 못합니다.
* 컨테이너 *는 발표자에 대한 참조를 보유하고 있지 않으므로 그 이유는 무엇입니까? 표시된 코드는 해당 Presenter에 대한 참조를 가져 와서 해당보기를 영역으로 고정하는 것입니다. –
컨테이너로 무엇을 언급하고 있습니까? –
컨테이너가 UnityContainer입니다. 일반적으로 Resolve <> 자체는 컨테이너에 컨테이너를 추가하는 ContainerControlledLifetimeManager 또는 PerInstanceLifetimeManager (사용자가 작성할 수 있음)로 유형을 등록하지 않는 한 컨테이너에 객체를 추가하지 않습니다. – aqwert