上記記事では、ViewModelの中でSynchronizationContextScheduler
を作成していましたが、これだと単体テストが辛いということになります。これをいい感じにするには、ちょっと工夫がいるのですが…。例えばPrism.Unityを使うと以下のようにViewModelのコンストラクタの引数に渡すものを上書きすることができます。Unityの機能ですね。
具体的には、App
クラスでConfigureViewModelLocator
メソッドをoverrideして、ViewModelLocationProvider.SetDefaultViewModelFactory
の処理を置き換えることで対応可能です。
protected override void ConfigureViewModelLocator() { base.ConfigureViewModelLocator(); ViewModelLocationProvider.SetDefaultViewModelFactory(x => this.Container.Resolve(x, new ParameterOverride("scheduler", new SynchronizationContextScheduler(SynchronizationContext.Current)))); }
こうしておくと、ViewModelでは、以下のような引数を定義しておくだけでUIスレッドに紐づいたSchedulerが設定されてきます。
public MainPageViewModel(IScheduler scheduler) { this.Time = new ReactiveProperty<string>(scheduler);
こうしておくと、単体テストでIScheduler
をTestSchedulerに差し替えたりということが簡単にできるようになります。