2013-07-06 3 views
0

일부 글로벌/세미 글로벌 콜렉션이 있습니다.mvvm (light) global 메시징을 사용해야합니까?

한 타이머의 일정은

에 추가 할 다른 그들에 수행하는 조치의 번호를 가질 수 원격 컴퓨터를 나타내는 수집

은 현재 내가 직접 참조하는 하나 개의 인스턴스 컬렉션이 있습니다.

대신 메신저를 사용하려고 생각했지만 Messenger.Default.Register를 사용하면 전역 변수를 사용하는 것과 다르지 않습니다. (목록의 각 요소에 함수를 추가하거나 실행하면 원하는 것이 아닐 수도 있습니다. 테스트).

특정 viewmodel에 등록하고 대신 메신저를 viewmodel 생성자에 전달해야합니까? 아니면 완전히 다른 일을합니까? 난 당신이 MVVM 라이트를 사용하고 있으리라 믿고있어

답변

1

... 그래서

:

당신은 기본적으로 두 개의 글로벌 컬렉션을 가지고 당신은 싱글 톤의 몇 있는데 문제는 방법 인 경우 이를 귀하의 뷰 모델에 가장 잘 통합하십시오.

나는이 두 가지를 서비스로 취급하고이를 인터페이스에 포함하는 클래스를 래핑합니다. 그래서 :

public interface IRemoteComputersService 
{ 
    void AddComputer(Computer computerToAdd); 
    void RemoveComputer(Computer computerToremove); 
    ReadOnlyCollection<Computer> RemoteComputers{get;} 
} 

이 인터페이스는 내 ViewModelLocator에서 원격 PC를

를 관리하는 클래스에 과부하를 할 필요가 나는 그것을 등록 할 것 : 나는 좋겠 내 뷰 모델에서

public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IRemoteComputersService,RemoteComputersService>(); 
      SimpleIoc.Default.Register<IDataService, DataService>();   
     } 
     SimpleIoc.Default.Register<MyViewModel>(); 
     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

} 

을 뷰 모델에 그것을 삽입하십시오 :

SimpleIoc은 재귀 적으로 d 귀하의 뷰 모델에 대한 독립성. "MyViewModel"은 IRemoteComputersService 서비스에 종속되므로 먼저이 문제를 해결 한 다음 viewmodel에 주입합니다.

MVVM-Light는 컨테이너에있는 각각의 항목을 기본적으로 싱글 톤으로 처리하므로 SimpleIoc에서 하나의 IRemoteComputersService 만 확인하게됩니다.

이 방법으로 문제를 해결할 수 있습니다. PC와 타이머를보기 쉽고 테스트 가능한 방법으로 액세스 할 수 있으며 메시징을 볼 필요가 없습니다.