MVVM Lightを使用していると思います...
そう:
基本的に 2 つのグローバル コレクションがある場合、シングルトンが 2 つあります。問題は、それらをビューモデルに最適に統合する方法です。
これらの両方をサービスとして扱い、それらを保持するクラスをインターフェイスにラップします。そう:
public interface IRemoteComputersService
{
void AddComputer(Computer computerToAdd);
void RemoveComputer(Computer computerToremove);
ReadOnlyCollection<Computer> RemoteComputers{get;}
}
インターフェイスは、リモート PC を管理するクラスにオーバーロードする必要があります。
私の ViewModelLocator では、それを登録します:
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>();
}
}
私の ViewModel では、それをビューモデルに挿入します。
public class MyViewModel:ViewModelBase, IMyViewModel
{
public MyViewModel(IRemoteComputersService remoteComputerService)
{
_remoteComputerService=remoteComputerService;
}
}
内部では、SimpleIoc がビューモデルの依存関係を再帰的に解決します。「MyViewModel」は IRemoteComputersService サービスに依存しているため、最初にこれを解決してからビューモデルに挿入します。
MVVM-Light は、コンテナー内で解決された各項目をデフォルトでシングルトンとして扱うため、SimpleIoc によって解決される IRemoteComputersService は 1 つだけであることが保証されます。
これにより、問題が解決されます。PC とタイマーがビューモデルにアクセスしやすくなり、テストしやすくなり、メッセージングを確認する必要がなくなります。