知识预备

阅读本文,我假定你具备以下知识:

  • C#和WPF基础知识
  • Lambda表达式

清楚ViewModel的职责

如果我们的程序需要弹出一个MessageBox,我们应该怎么做?

我见过不少人在ViewModel里面写着:MessageBox.Show("xxx");

程序的功能看似没有什么问题,日后我要把这个ViewModel用到WinRT上,你是不是傻眼了?WinRT是没有MessageBox的。

为什么会出现这样的情况呢?请仔细想想,弹出MessageBox是ViewModel的职责吗?

很明显,MessageBox是与交互相关的东西,对MessageBox的操作应该在UI上执行,我们又知道,ViewModel是不知道View的存在的,那当业务逻辑产生了交互请求时,应该怎样通知UI呢?这里就引出我们今天要讲的Messenger。

通过消息实现松散耦合

这个名词有点抽象,举个简单的例子,老师上课时算一道题,要做一个计算,对同学们说:"哪个同学有计算器的帮我算一下这个。",然后很快有同学算好并且在下面喊:"老师,算好了,这个等于xxx!!!"。

在这里不难看出,老师并不依赖于任何一个学生,他只是简单的发出一个消息,然后同学收到老师的请求,执行操作,并将结果一消息的形式返回给老师。老师只是找了个人帮忙计算,并不需要知道是谁在帮忙计算。

这样的好处应该在如今的云计算时代体现的比较明显,举个例子,我们可以把Web前段和BLL分开,中间通过Windows Azure的Service Bus,以消息的形式进行通信,这样,我们可以根据负载情况,把Web层和BLL分别缩放,而不需要考虑他们的依赖关系。

实现一个简单的Messenger

实现Messenger的思想是:通过一个中心的Dictionary存储消息的标记和处理者的关系,在消息发出时,调用对应的处理者。

这是一个非常简陋的Messenger,我们假定一切正常,没有进行错误处理,对于理解Messenger的思想来说,已经足够了,但在实际应用中,一定要注意。

使用MVVM Light的Messenger

相信通过上一个例子,大家已经对Messenger的机制有了一定的理解,我们现在就来用Messenger实现ViewMoel和View的交互请求。

程序非常简单,点击按钮,弹出消息框。

我们现在Windows里面注册这个消息

然后在ViewModel里面发送消息,这里的"MSG"就是消息的标记,他由消息的发送者和接受者约定,这样,对于这个交互请求,不同的表现层技术可以采用不同的相应方式,例如WPF可以用MessageBox,WinRT可以用MessageDialog。

在这里我们使用Messenger默认提供的实例,当然我们也可以另外创建实例。

你可能会有的疑问

所有的消息集中在一个Messenger,会不会混乱?

从消息的容器里面看,的确凌乱不堪,这也是我把文章题目叫做消息满天飞的原因,但我们最终的目的达到了。想想依赖注入的容器吧,一样的。

Windows Azure Service Bus 是什么东西?

这是Windows Azure提供的一系列系统整合服务,包括队列服务,主题/订阅服务,中继服务,通知中心等,详见:https://www.windowsazure.com/en-us/documentation/services/service-bus/

说不尽的MVVM(5) - 消息满天飞的更多相关文章

  1. 说不尽的MVVM(1) – Why MVVM

    最近学的一篇课文<说不尽的狗>竟让我有了写<说不尽的MVVM>这一想法,事非亵渎,实出无奈.我在刚学WPF不久时听说有MVVM这种东西,做了下尝试,发现他能给程序的设计带来很大 ...

  2. 说不尽的MVVM(4) – 发号施令的Command

    知识预备 阅读本文,我假定你具备以下知识: C# WPF基础知识 知道WPF的命令 WPF相对WinForm加了一种Command的机制,对用户的操作进行更加灵活的处理,相信很多朋友知道并用过Rout ...

  3. 说不尽的MVVM(3) – 从通知属性说起

    上篇我们体验了一个从事件处理程序到MVVM程序的转变,在最后也留下了一个问题:RaisePropertyChanged的原理是什么?今天我们来一探究竟. 通过上节做的小例子我们知道,仅仅修改ViewM ...

  4. 说不尽的MVVM(2) – MVVM初体验

    知识预备 阅读本文,我假定你已经具备以下知识: C#.WPF基础知识 了解Lambda表达式和TPL 对事件驱动模型的了解 知道ICommand接口 发生了什么 某程序员接到一个需求,编写一个媒体渲染 ...

  5. wpf mvvm模式下 在ViewModel关闭view

    本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息 public UserView() { this.DataContext = new UserVie ...

  6. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  7. Netty_Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  8. 【netty】Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  9. QT 4.2.2的安装(安装完还要再编译,注意设置Windows Path)

    (安装篇)前奏: 提到C++的GUI Framework估计大多数人都会想到MFC.VCL,因为在十年前的COM时代,这两个大家伙几乎垄断了整个C++ windows平台上应用程序的开发市场, 但是最 ...

随机推荐

  1. js实现倒计时及时间对象

    JS实现倒计时效果代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> ...

  2. Delphi 字符数组存入文件

    TDMSRequestBuffer=object    Head:TDMSHead;    Data:array[0..2047] of char;    DataSize:Integer;    p ...

  3. Hosting static website on AWS

    http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#root-d ...

  4. jQuery数组处理汇总

    jQuery数组处理汇总   有段时间没写什么了, 打算把jquery中的比较常用的数组处理方法汇总一下 $.each(array, [callback])遍历,很常用 1 2 3 4 5 6 7 8 ...

  5. 初识ASP.NET CORE:二、优劣

    Which one is right for me? ASP.NET is a mature web platform that provides all the services that you ...

  6. CSS3--背景颜色的渐变效果

    一.渐变:gradients 线性渐变(linear gradients) background:-webkit-linear-gradient(90deg,red 10%,blue); 1.需要有内 ...

  7. iptables配置允许vpnserver(softether vpn)

    防火墙配置 -A INPUT -p udp -m multiport --dport ,,,, -j ACCEPT

  8. memcache与memcached介绍及安装配置

    也许大家一看到Memcache和Memcached会有点晕,这两者有什么关系又有什么区别呢,下面先给大家说下Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应 ...

  9. zendstudio 声明变量类型,让变量自动方法提示

    zendstudio 行内注释, 显式声明变量类型,让变量自动方法提示 $out = []; /* @var $row \xxyy\SizeEntity */ foreach ($rows[ 'lis ...

  10. 咏南中间件+开发框架支持最新的DELPHI XE10.1(BERLIN) UPDATE1

    咏南中间件+开发框架支持最新的DELPHI XE10.1(BERLIN) UPDATE1 购买提供:中间件源码,价格十分优惠!有意者请向本人索取演示程序! 附带福利(赠送): CS开发框架源码BS开发 ...