MVVM Light Messenger 的正确使用方法

2023-11-23

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

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

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

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

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

这里的好处是:

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

Edit: 那么,服务呢?

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

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

我见过的一件事是使用信使作为mediator,这里不是将服务直接注入到视图模型中,而是将信使注入到视图模型中。视图模型订阅事件并从该事件接收包含模型的事件。如果您正在接收稳定的更新流,或者您正在从多个服务接收更新并希望将其合并到单个流中,那么这非常有用。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM Light Messenger 的正确使用方法 的相关文章

  • 绑定到 ListView 项目从视图模型中点击的属性

    我正在尝试使用 itemtapped 属性将事件绑定到菜单页面上的 ListView 目前我在我的应用程序中使用 MVVM Xamarin 表单实验室 框架 我想要完成的是当用户点击菜单项时应用程序导航到正确的视图 这是xaml代码
  • 使用 MVVM 绑定 Xamarin.Forms 中的属性

    我在使用 Xamarin Forms 和 MVVM 制作游戏时遇到问题 游戏中有一艘由用户控制的潜艇 并且有水雷掉落 因此用户必须避开这些水雷 这些地雷是在运行时使用 2 个计时器生成的 因此我用 XAML 中的 CollectionVie
  • WPF - 从 UserControl 发出命令时 CanExecute 不会触发

    我有一个按钮条用户控件 我想在我的大多数表单上使用它 我添加了如下命令 public ICommand Create get return buttonCreate Command set buttonCreate Command valu
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • MVVM 路由和中继命令

    两者有什么区别路由命令 http msdn microsoft com en us library system windows input routedcommand aspx and 中继命令 http msdn microsoft c
  • LiveData无法观察到变化

    我正在更新一个ViewModel 中 DialogFragment 的 LiveData 值 但无法获取Fragment中的值 视图模型 class OtpViewModel private val otpUseCase OtpUseCas
  • 如何在数据加载期间 IsBusy 为 true 时至少显示一次 Lottie 动画?

    On my Xamarin Forms 项目 我想显示一个洛蒂动画 during API调用或期间加载网站 in a WebView 为此 我限制了IsVisible的财产洛蒂动画 to the IsBusy我的财产视图模型 这个效果很好
  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • wpf 的 prism 与 mvvm light

    我们正在启动一个带有 MVVM 的 WPF 项目 并且必须决定使用 PRISM 还是 MVVM Light 我对这两个框架都是新手 我已经阅读了一些帖子 但仍然有一些问题 有人可以阐明以下几个方面吗 两个框架 性能 无论出于何种原因 其中一
  • 在 AngularJS 中设置应用程序范围的 HTTP 标头

    有没有办法设置 httpProvider标题之外angular module myApp config 登录用户后 我从服务器获取身份验证令牌 我需要将其作为 HTTP 标头添加到所有后续请求中 您可以使用角度的默认标题1 0 x http
  • 带有命令绑定的 KeyBinding 不适用于 TextBox UpdateSourceTrigger LostFocus

    我正在使用 MVVM 并遇到以下问题 我的 TextBox Text 与 UpdateSourceTrigger LostFocus 绑定 这就是用户想要的 我有一个带有 SaveCommand CommandBinding 的按钮 这有效
  • 如何在向 MSMQ 发送消息时启用负源日志?

    我试图通过 System Messaging MessageQueue NET 发送消息 但消息不断消失 我见过有人建议启用负源日志 但似乎不知道这是如何完成的 任何人 Message m new Message m UseDeadLett
  • Windows 8 Windows 应用商店应用程序中的中继命令

    由于 CommandManager 在 win8 Metro 应用程序中不可用 是否有 RelayCommand 的版本 有一个版本here https xp dev com svn mytoolkit Shared MVVM RelayC
  • ViewModel 中的 TextBox CaretIndex 属性

    是否可以通过视图中定义的 Binding 获取 设置 wpf 视图模型中 TextBox 控件的 CaretIndex 属性的值 Thanks 这里的问题是如何获得CaretIndex of the TextBox通过视图模型进行控制 如果
  • iOS App Store ExecutionEngineException 尝试 JIT 编译

    我有一个非常尴尬的问题 我已经为 iOS 构建了我的应用程序 并在所有模拟器上对其进行了测试 并且运行良好 我已将其安装在设备 iPhone 6 plus 上 效果也很好 然而 当我将其提交到应用商店时 反馈是它在所有设备上启动时都会崩溃
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • WPF + MVVM + RadioButton:如何处理单个属性的绑定?

    From this https stackoverflow com questions 2284752 mvvm binding radio buttons to a view model and this https stackoverf
  • WPF MVVM 应用程序服务层中的 ObservableCollection

    我在 Internet 上看到的 WPF MVVM 应用程序示例将 VM 视为与服务层交互的层 该服务层要么使用外部库中的 旧 事件 要么使用 HTTP 或其他方式与 Web 交互 但是如果我自己构建所有 M V VM 服务和其他部分怎么办
  • MVVM模式下向UIViewController传递数据

    我正在为我的视图控制器使用 MVVM 但我遇到了一个问题 我不确定解决它的最佳方法是什么 基本上 视图控制器 A 显示一个表视图 其中填充了视图模型 A 中的数据 每个单元格都有自己的视图模型 视图模型 A 负责创建这些视图模型并将它们公开
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多

随机推荐

  • ASP.NET MVC 3 动态控件

    我是 MVC 新手 想知道如何在 MVC3 中动态创建控件 就我而言 情况是有一个表格 候选人可以在其中输入他的工作经历 他可以根据他之前工作过的公司数量添加多个条目 因此 当用户说 添加另一个 时 需要动态添加用户输入详细信息的控件集 我
  • 使用 jstree ui 时,如何让 jstree 中的叶节点在单击时打开其超链接?

    我使用jtree显示一个层次结构 数据如下 div ul li a href C a ul li a href Music a ul li a href Z a ul li a href Hans Zimmer a ul li a href
  • 在javascript中获取矩阵的所有可能选项

    我在 JavaScript 中有一个 item 对象 该项目可以具有如下设置 颜色 尺寸等 我需要在数组中获取所有可能的组合 假设我们有一个看起来像这样的项目 var newItem name new item Settings name
  • 为什么函数调用中的尾随逗号不是语法错误?

    我希望这段代码会失败 因为逗号充当参数分隔符 没有第二个参数并且foo只接受一个参数 fn foo a u8 fn main foo 3 大多数语言接受逗号分隔列表中的尾随逗号 例如参数列表或元组或数组文字 如果您将列表拆分为多行 这会很有
  • Java中的字符串初始化

    String str1 String str2 null String str3 String str4 new String String str5 new String 我知道对于上面的第三次初始化 字符串对象是在字符串池中初始化的 第
  • 取消引用空指针

    希望对答案有更好的理解 给出this帖子 有人可以向我解释一下吗 以下循环缓冲区实现是可能的 并且如果 不 为什么不 define CB TYPE CHAR 0 define CB TYPE FLOAT 1 typedef struct C
  • 拒绝所有不阻止返回重定向

    Nginx 的表现对我来说出乎意料 这是两个简化的位置块 这按预期工作 返回 403 错误 location deny all root var www test 我预计会出现 403 错误 然而 这会返回 301 并重定向 locatio
  • 我应该在所有 iOS 项目的其他链接器标志中包含“-ObjC 和 -all_load”吗? [复制]

    这个问题在这里已经有答案了 可能的重复 all load 链接器标志有什么作用 我看到大多数静态库都要求你这样做 所以我将它们添加到我的所有项目中 添加这个似乎没有副作用 有一个副作用 构建阶段需要很多时间 ObjC 允许静态库使用 Obj
  • 在 TypeScript 中扩展基本类型,错误:“_this 未定义...”

    我正在尝试用 TypeScript 重写一些 JavaScript 代码 其中一些代码引用了我添加到字符串对象原型中的扩展 String prototype format function var formatted this for va
  • Python将numpy数组插入sqlite3数据库

    我试图在 sqlite3 数据库中存储大约 1000 个浮点的 numpy 数组 但我不断收到错误 InterfaceError 绑定参数 1 错误 可能不受支持的类型 我的印象是 BLOB 数据类型可以是任何类型 但它绝对不适用于 num
  • 在表的所有列中搜索某个值?

    我一直在寻找这个问题的答案 但我所能找到的只是人们询问如何在数据库中的所有表的所有列中搜索值 我只想搜索特定表的所有列 人们为所有表问题提出的代码很复杂 我很难弄清楚它到底在哪里搜索特定的表 有人可以帮我吗 谢谢 只需使用一些第三方工具即可
  • Eclipse 不一致:资源泄漏:“<未分配的可关闭值>”从未关闭

    如果我有以下代码 public OutputStream test boolean condition throws FileNotFoundException return condition null new FileOutputStr
  • 如何以编程方式知道 Grails 中是否存在视图或布局文件

    我想以编程方式知道 grails 中是否存在视图或布局 我正在考虑获取绝对路径并要求 File exists 但我不知道如何为每个环境获取此路径 我曾尝试过groovyPagesTemplateEngine getUriWithinGrai
  • 将 PHP 对象存储在会话变量中

    我是面向对象编程的新手 正在编写我的第一门课程 我为一家保险经纪人工作 并尝试使用类来存储有关报价的信息 并将对象存储为会话变量 问题是 当我查看会话变量时 我得到 sessionName PHP Incomplete Class Obje
  • 这是 Files.lines() 中的错误,还是我误解了并行流的某些内容?

    环境 Ubuntu x86 64 14 10 Oracle JDK 1 8u25 我尝试使用并行流Files lines 但是我要 skip 第一行 它是一个带有标题的 CSV 文件 因此我尝试这样做 try final Stream
  • linux中什么是chained irq,什么时候需要使用它们?

    什么是链式IRQ 什么是chained irq enter and chained irq exit这样做 因为在中断发生后 IRQ 线被禁用 但是chained irq enter正在调用与屏蔽中断相关的函数 如果线路已经被禁用 为什么要
  • 将多个版本的 Angular 应用程序部署到 Azure 应用服务

    我有一个 Angular 应用程序 可以毫无问题地部署到 Azure 应用服务 首先 我使用以下命令编译我的应用程序 ng build output path dist aot prod 然后我添加以下内容web config to the
  • NuGet 在 VS 2013 中保持“正在检索信息”或“未找到结果”

    突然间 NuGet 停止了所有项目的工作 我在办公室的 4 台不同的计算机上尝试过 所有计算机都停止工作 如果我转到 管理 NuGet 包 当节点出现时 它会显示 未找到项目 Online gt nuget org被选中 我上次检查前一段时
  • 将项目导入 Netbeans

    我的客户刚刚向我发送了用于开发目的的基础项目 我认为他只是将项目文件夹压缩并发送给我 现在 当我转到 NetBeans 时 使用现有源的新项目 首先我看到错误 该项目已经包含构建文件夹 我从项目中删除了构建文件夹 然后收到错误 该项目已经包
  • MVVM Light Messenger 的正确使用方法

    正确的使用方法是什么Messenger班级 我知道它可以用于 ViewModels Views 通信 但是将它用于技术 业务服务层是一个好方法吗 例如 日志记录 导航服务在构造函数中注册一些消息 并知道这些消息何时在应用程序中发生 发送者