[聚合文章] Prism for WPF再探(基于Prism事件的模块间通信)

.Net 2018-01-03 26 阅读

上篇博文链接

Prism for WPF初探(构建简单的模块化开发框架)

一、简单介绍: 

 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的。

      先上效果图:初步介绍下,图中虚线分割为四个模块,每个模块可向另外三个模块发消息。这里还是基于模块化开发CS端程序的思路,模块之间低耦合,如果项目做大,好处自然体现出来了。

 

 

  图中的效果已经实现了一个模块朝其他三个模块发送消息。这里我使用的事Prism框架中的PubSubEvent事件,其优点是简单易用,直接Publish和Subscribe即可。

二、基本思路

  项目结构图:

  四个模块间基础和共用的东西我放在Desktop.Infrastructure中。A、B、C、D四个模块都保持对Desktop.Infrastructure的引用,各自间无引用,相互独立,以后需要添加删除模块或者改动既有模块,都不影响其他模块的功能。

 

1、事件与接口,代码很简单。

接口代码:接口定义空的就行,后面Event需要Publish的Model继承自接口IBaseModel。

namespace Desktop.Infrastucture.Interface{    public interface IBaseModel    {    }}

事件代码:自定义事件 SendMessageEvent 继承自Prism框架的PubSubEvent。定义好Event,之后只需要在IEventAggregator的实现中Publish和Subscribe即可。

namespace Desktop.Infrastucture.Event{    public class SendMessageEvent : PubSubEvent<IBaseModel>    {    }}

 

从下图可以看到PubSubEvent的定义,其Subscribe支持过滤。

实现原理中其实是个模块都订阅了同一个事件,所以每个模块发一次消息它本身也会接收到,而第一张的效果图中发送消息的模块本身并没有显示出接收到消息,是因为我在Subscribe的时候将本身发的消息的过滤了。

 

 2、Model的实现。

发送的数据为ModelData,所以ModelData肯定要继承自IBaseModel,由于WPF经常需要实现通功能,也就是必须继承自INotifyPropertyChanged接口(这点是WPF的内容),所以我定义了一个BaseNotificationObject来继承INotifyPropertyChanged和IBaseModel,ModelData继承自BaseNotificationObject。

namespace Desktop.Infrastucture.Model{    [Export(typeof(ModelData))]    [PartCreationPolicy(CreationPolicy.NonShared)]    public class ModelData: BaseNotificationObject    {        /// <summary>        /// 模块名称        /// </summary>        private ModuleNameEnum _ModuleName;        public ModuleNameEnum ModuleName        {            get { return _ModuleName; }            set { _ModuleName = value;            }        }        /// <summary>        /// 消息内容        /// </summary>        private string _Message;        public string Message        {            get { return _Message; }            set { _Message = value;                OnPropertyChanged("Message");            }
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。