使用MVVM光使者有道(Proper way of using MVVM Light Messeng

2019-06-27 15:33发布

什么是使用正确的方式Messenger类? 我知道它可以用于的ViewModels /浏览次数通信,但它用它的技术/业务服务层的好方法吗?

例如,一个记录/导航服务在构造一些消息寄存器,并意识到当这些消息在应用中发生。 发送者(视图模型OU服务)不引用服务接口,但只有信使用于发送消息。 这里有一个简单的服务:

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;
        }
    }
}

Answer 1:

对我来说,主要使用的使者的是,因为它允许的ViewModels之间的通信。 比方说你有一个用于提供业务逻辑的搜索功能,你的页面/窗口3周的ViewModels是要处理的搜索显示输出,信使将是一个松散的绑定来做到这一点的理想方式一个视图模型办法。

该得到的搜索数据视图模型将只需发送,将通过目前正在注册使用该消息的任何消费“搜索”的消息。

这里的好处是:

  1. 无需每个视图模型不必了解彼此的ViewModels之间容易的通信
  2. 我可以换出制片人,而不会影响消费者。
  3. 我可以毫不费力地添加更多的信息消费者。
  4. 它保持的ViewModels简单

编辑: 那么,怎么样的服务?

的ViewModels都是关于如何将数据提交给UI。 他们把你的数据,并将其塑造成一些可以提供给您的视图。 从的ViewModels服务得到他们的数据。

服务提供的数据和/或业务逻辑视图模型。 该服务的工作是服务于商业模式的请求。 如果一个服务需要沟通/使用其他服务来完成自己的工作,这些应该使用依赖注入被注入到该服务。 服务一般不会互相使用信使通信。 信使是非常关注在视图模型的水平横向沟通。

有一件事我见过做的是使用信使作为中介 ,在那里,而不是直接注射服务为一体的视图模型信使注入到视图模型来代替。 视图模型赞同事件和接收包含模型从事件的事件。 如果您收到更新源源不断或者您收到从要合并成一个单一的数据流多个服务更新,这是伟大的。

使用信使而不是注入的服务,当你正在做的请求/响应类型的请求没有任何意义,因为你必须编写更多的代码要做到这一点,你不得不写干脆直接注射服务,它使代码难以阅读。

看你的代码,上面。 试想一下,如果你要在那里(导航,CanNavigate,GoBack的,GoForward等)写每个方法的事件。 你会最终获得了不少信息。 你的代码也将更难遵循。



文章来源: Proper way of using MVVM Light Messenger