11.17.2016

ReactiveUI-MessageBus

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.

沒有留言:

張貼留言