正确的使用方法是什么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 个视图模型想要处理搜索以显示输出,消息传递器将是在松散绑定中执行此操作的理想方式方式。
获取搜索数据的视图模型将简单地发送一条“搜索”消息,该消息将被当前注册以使用该消息的任何内容所使用。
这里的好处是:
- 视图模型之间轻松通信,每个视图模型不必相互了解
- 我可以在不影响消费者的情况下更换生产者。
- 我可以毫不费力地添加更多消息消费者。
- 它使视图模型保持简单
Edit:
那么,服务呢?
ViewModel 是关于如何向 UI 呈现数据的。他们获取您的数据并将其塑造成可以呈现给您的视图的东西。 ViewModel 从服务获取数据。
服务向 ViewModel 提供数据和/或业务逻辑。服务工作是为业务模型请求提供服务。如果服务需要通信/使用其他服务来完成其工作,则应使用依赖注入将这些服务注入到服务中。服务通常不会使用信使相互通信。 Messenger 非常注重视图模型级别的水平通信。
我见过的一件事是使用信使作为mediator,这里不是将服务直接注入到视图模型中,而是将信使注入到视图模型中。视图模型订阅事件并从该事件接收包含模型的事件。如果您正在接收稳定的更新流,或者您正在从多个服务接收更新并希望将其合并到单个流中,那么这非常有用。
当您执行请求/响应类型请求时,使用信使而不是注入服务没有任何意义,因为您必须编写更多代码来执行此操作,而您只需直接编写服务即可使代码难以阅读。
查看上面的代码。想象一下,如果您必须为每个方法(Navigate、CanNavigate、GoBack、GoForward 等)编写一个事件。你最终会收到很多消息。您的代码也将更难遵循。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)