知识预备

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

  • 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. Nginx服务测试时的一些配置:wireshark、常用搜索URL格式、关闭防火墙、siege

    wrieshark sudo yum install wireshark-gnome sudo wireshar (以root启动,否则看不到网卡) 网站URL格式 以查询lumia为例 google ...

  2. Flat UI

    Flat :平的; 单调的; 不景气的; 干脆的; 免费的WEB界面工具组件库

  3. Linux编程下EAGAIN和EINTR宏的含义及处理

    Linux中的EAGAIN含义   在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). linux下使用write\send ...

  4. SeleniumIDE初级入门

    Selenium  IDE:它是使用Javascript 脚本语言与CS端的DOM对象进行交互,并且为修改测试用例提供了接口.录制功能是它最大的亮点,录制功能可以让测试人员对需要进行测试的功能流程进行 ...

  5. C++奇数魔方阵

    理解了算法的思想就很简单了, 首先将1放到第一排的中间,然后向左上角走,当行数超过索引,则将该数放到最后一排接下来的一列中去,当列数超过索引,则放到上一排的第一列中去,若都没有超过索引,但是此时的右上 ...

  6. [题解]hdu 1009 FatMouse' Trade(贪心基础题)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  7. cell线条前后缩短

    [cell setSeparatorInset:UIEdgeInsetsMake(0, 20, 0, 20)];

  8. MyScript 手写识别数学公式、图形 自动计算

    项目的地址  http://git.oschina.net/bimingcong/MyScript #说明:MyScript是一种能够自动识别用户在屏幕上的手势,然后转化为相应的数学公式.图形(比如三 ...

  9. ABAP BDC

    REPORT程序中用BDC录入 DATA: GS_BDC TYPE BDCDATA, GT_BDC TYPE TABLE OF BDCDATA, GS_MSG TYPE BDCMSGCOLL, GT_ ...

  10. zabbix使用host metadata方式主动注册

    host metadata是zabbix2.2新增加的功能,该功能在zabbix-agent端可以自定义条件,在选择自动注册的时候,zabbix-server端可以根据host metadata来选择 ...