有关使用IMvxMessenger与使用基于服务的事件的建议

时间:2014-04-16 03:08:49

标签: xamarin mvvmcross

我正在一个需要发布各种事件的大型应用程序中创建10-20个核心服务。我查看了IMvxMessenger模型,我正在尝试确定使用IMvxMessenger事件与通过我们的应用程序服务发布的事件的价值。

通过我们的服务发布活动的主要优势是使用该服务的开发人员可以快速确定可用的活动。

e.g。 myService.ObserveLogonChange()或myService.LogonChangedEvent等。

在查看IMvxMessenger时,它允许您以非常通用的方式发布任何类 - 但知道如何订阅这些类很大程度上依赖于开发人员对代码库有更深入的了解,以了解要监听的事件。

所以我的问题是,通过让服务发布事件与IMvxMessenger方法,我有什么损失吗?

提前致谢。

艾伦。

1 个答案:

答案 0 :(得分:5)

这是一个可能适合你的模式。

编辑:示例代码位于此处 - > https://github.com/kiliman/MvxEventsSample

基本上,在名为Events的服务类中创建一个内部类。这将包含您的服务发布的每个事件的属性。然后在视图模型中,创建此Events类的实例并添加所需的任何处理程序。这样,您就可以使用一个很好的描述性类来显示可用的事件,但仍使用MvxMessenger来确保弱引用。

public interface IMyService
{
    void Logon();
    void DoSomething();
}

public class MyService : IMyService
{
    private readonly IMvxMessenger _messenger;

    public MyService(IMvxMessenger messenger)
    {
        _messenger = messenger;
    }

    public void Logon()
    {
        _messenger.Publish(new LogonChangedMessage(this));
    }

    public void DoSomething()
    {
        _messenger.Publish(new AnotherEventMessage(this, string.Format("Do Something at {0}", DateTime.Now)));
    }

    // Events class defines all possible events as properties
    // Notice that we only need setters
    // We also store the subscription tokens
    public class Events
    {
        private readonly IMvxMessenger _messenger;

        public Events(IMvxMessenger messenger)
        {
            _messenger = messenger;
        }

        private MvxSubscriptionToken _logonChangedToken;
        public Action<LogonChangedMessage> OnLogonChanged
        {
            set { _logonChangedToken = _messenger.Subscribe(value); } 
        }

        private MvxSubscriptionToken _anotherEventToken;
        public Action<AnotherEventMessage> OnAnotherEvent
        {
            set { _anotherEventToken = _messenger.Subscribe(value); }
        }
    }

    public class LogonChangedMessage : MvxMessage
    {
        public LogonChangedMessage(object sender) : base(sender)
        {
        }
    }

    public class AnotherEventMessage : MvxMessage
    {
        public AnotherEventMessage(object sender, string text) : base(sender)
        {
            Text = text;
        }

        public string Text { get; set; }
    }
}

以下是您在视图模型中使用它的方法。请注意我是如何创建MyService.Events的实例,然后使用lambda表达式来设置事件处理程序。

public class FirstViewModel : MvxViewModel
{
    private readonly IMyService _myService;
    private readonly MyService.Events _events;
    private int _counter = 0;

    public FirstViewModel(IMyService myService, IMvxMessenger messenger)
    {
        _myService = myService;

        // Initialize event handlers using lambda expressions
        _events = new MyService.Events(messenger)
        {
            OnLogonChanged = message =>
            {
                Hello = "OnLogonChanged: " + (++_counter);
                Mvx.Trace("OnLogonChanged");
            },
            OnAnotherEvent = message =>
            {
                Hello = message.Text;
                Mvx.Trace("OnAnotherEvent");
            }
        };
    }

    private string _hello;
    public string Hello
    {
        get { return _hello; }
        set { _hello = value; RaisePropertyChanged(() => Hello); }
    }


    private MvxCommand _logonCommand;
    public ICommand LogonCommand
    {
        get
        {
            _logonCommand = _logonCommand ?? new MvxCommand(_myService.Logon);
            return _logonCommand;
        }
    }

    private MvxCommand _doSomethingCommand;
    public ICommand DoSomethingCommand
    {
        get
        {
            _doSomethingCommand = _doSomethingCommand ?? new MvxCommand(_myService.DoSomething);
            return _doSomethingCommand;
        }
    }
}