@neueccさんが、またプルリクをくれました。UniRxからポーティングされたクラスが1つ追加されました。 MessageBrokerというRxっぽく使えるMessenger的なクラスになります。
基本的に以下のような使い方になります。
// 購読 MessageBroker.Default.Subscribe<SampleClass>(x => Console.WriteLine(x)); // ToObservableでRxのメソッド使い放題 MessageBroker.Default.ToObservable<SampleClass>() .ObserveOn(Dispatcher) .Subscribe(x => Console.WriteLine(x)); // 発行 MessageBroker.Default.Publish(new SampleClass());
非同期版も用意されています。
AsyncMessageBroker.Default.Subscribe<SampleClass>(async x =>
{
Console.WriteLine(x);
return Task.Delay(TimeSpan.FromSeconds(2));
});
var d = AsyncMessageBroker.Default.Subscribe<SampleClass>(async x =>
{
Console.WriteLine(x);
return Task.Delay(TimeSpan.FromSeconds(4));
});
// 全てのSubscribeが終了するまで待ちます
await AsyncMessageBroker.Default.PublishAsync(new SampleClass());
// 購読解除
d.Dispose();
await AsyncMessageBroker.Default.PublishAsync(new SampleClass());
一応、上記のようなDefaultでデフォルトインスタンスを使いまわすことがほとんどだと思いますが自分でインスタンス管理したい場合は特に制約は設けてないので好きにnewするなりDIコンテナに登録しちゃってください。