10

使用Messengerclass 的正确方法是什么?我知道它可以用于 ViewModels/Views 通信,但是将它用于技术/业务服务层是一种好方法吗?

例如,日志/导航服务在构造函数中注册一些消息,并知道这些消息何时出现在应用程序中。发送者(ViewModel ou Service)不引用服务接口,只引用messenger发送消息。这是一个示例服务:

using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using App.Service.Interfaces;
using GalaSoft.MvvmLight.Messaging;

namespace App.Service
{
    public class NavigationService : INavigationService
    {
        private PhoneApplicationFrame _mainFrame;

        public event NavigatingCancelEventHandler Navigating;

        public NavigationService()
        {
            Messenger.Default.Register<NotificationMessage<Uri>>(this, m => { this.NavigateTo(m.Content); });
        }

        public void NavigateTo(Uri pageUri)
        {
            if (EnsureMainFrame())
            {
                _mainFrame.Navigate(pageUri);
            }
        }

        public void GoBack()
        {
            if (EnsureMainFrame()
                && _mainFrame.CanGoBack)
            {
                _mainFrame.GoBack();
            }
        }

        private bool EnsureMainFrame()
        {
            if (_mainFrame != null)
            {
                return true;
            }

            _mainFrame = Application.Current.RootVisual as PhoneApplicationFrame;

            if (_mainFrame != null)
            {
                // Could be null if the app runs inside a design tool
                _mainFrame.Navigating += (s, e) =>
                {
                    if (Navigating != null)
                    {
                        Navigating(s, e);
                    }
                };

                return true;
            }

            return false;
        }
    }
}
4

1 回答 1

25

对我来说,messenger 的主要用途是因为它允许 viewModel 之间的通信。假设您有一个视图模型,用于为搜索功能提供业务逻辑,并且您的页面/窗口上有 3 个视图模型想要处理搜索以显示输出,信使将是在松散绑定中执行此操作的理想方式方式。

获取搜索数据的视图模型将简单地发送一条“搜索”消息,该消息将被当前注册以使用该消息的任何东西所使用。

这里的好处是:

  1. 视图模型之间的轻松通信,无需每个视图模型相互了解
  2. 我可以在不影响消费者的情况下更换生产者。
  3. 我可以毫不费力地添加更多消息消费者。
  4. 它使视图模型保持简单

编辑: 那么,服务呢?

ViewModel 都是关于如何将数据呈现给 UI。他们获取您的数据并将其塑造成可以呈现给您的视图的东西。ViewModel 从服务中获取数据。

服务向 ViewModel 提供数据和/或业务逻辑。服务工作是为业务模型请求提供服务。如果服务需要通信/使用其他服务来完成其工作,则应使用依赖注入将这些服务注入到服务中。服务通常不会使用信使相互通信。Messenger 非常关注视图模型级别的水平通信。

我见过的一件事是使用 messenger 作为中介,而不是将服务直接注入到 viewmodel 中,而是将 messenger 注入到 viewmodel 中。viewmodel 订阅一个事件并从该事件中接收包含模型的事件。如果您正在接收稳定的更新流,或者您正在接收来自多个服务的更新,并且您希望将这些更新合并到一个流中,那就太好了。

当您执行请求/响应类型请求时,使用信使而不是注入服务没有任何意义,因为您必须编写更多代码来执行此操作,而您必须编写直接注入服务并且它使代码难以阅读。

看看你的代码,上面。想象一下,如果您必须为那里的每个方法(Navigate、CanNavigate、GoBack、GoForward 等)编写一个事件。你最终会收到很多消息。您的代码也将更难遵循。

于 2012-09-05T13:15:18.177 回答