MessageBus
這篇文章介紹了ReactiveUI Message Bus的基本概念,它的最簡用法大致如下程式碼所示─
var cur = MessageBus.Current;
cur.Listen<int>().Subscribe(i=>Console.WriteLine("value is {0}", i));
cur.SendMessage(1);
cur.SendMessage(2);
基本上,這其實類似設計模式中的Mediator模式,或者是所謂的Event-Broker方式,根據之前的經驗,應能有效解耦各類別之間的關系,不過有位仁兄有不同的意見MVVM anti-pattern: Using UI Message Bus communicate between ViewModels & Services,不過我目前的經驗還沒辦法理解他的說明,也許從之後的實作再來看。
而在ReactiveUI-Sample中,提供的測試碼為─
public class MainViewModel : ReactiveObject
{
public MainViewModel()
{
Publisher = new PublisherViewModel();
Subscriber = new SubscriberViewModel();
}
public PublisherViewModel Publisher { get; set; }
public SubscriberViewModel Subscriber { get; set; }
}
public class PublisherViewModel : ReactiveObject
{
public PublisherViewModel()
{
PublishCommand = ReactiveCommand.Create();
MessageBus.Current.RegisterMessageSource(PublishCommand);
}
public IReactiveCommand<object> PublishCommand { get; protected set; }
}
public class SubscriberViewModel : ReactiveObject
{
public SubscriberViewModel()
{
MessageBus.Current.Listen<object>().Subscribe(_ =>
{
Value++;
});
}
private int _Value;
public int Value
{
get { return _Value; }
set { this.RaiseAndSetIfChanged(ref _Value, value); }
}
}
主要是這兩個類別
-PublisherViewModel,出版/發行者
-SubscriberViewModel,訂閱者
由出版者註冊命令,訂閱者訂閱當命令觸發時預執行的動作,雙方互相沒有關係,僅透過MessageBus作實際上的溝通。
Written with StackEdit.
沒有留言:
張貼留言