Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

ReactivePropertyで自動でUIスレッドにイベント発行を変えるのを抑止する その2

$
0
0

blog.okazuki.jp

上記記事では、ViewModelの中でSynchronizationContextSchedulerを作成していましたが、これだと単体テストが辛いということになります。これをいい感じにするには、ちょっと工夫がいるのですが…。例えばPrism.Unityを使うと以下のようにViewModelのコンストラクタの引数に渡すものを上書きすることができます。Unityの機能ですね。

具体的には、AppクラスでConfigureViewModelLocatorメソッドをoverrideして、ViewModelLocationProvider.SetDefaultViewModelFactoryの処理を置き換えることで対応可能です。

protectedoverridevoid 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に差し替えたりということが簡単にできるようになります。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>