一、简单介绍:
在上一篇博文中初阶搭建了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"); } } } }
3、ViewModel的实现。
每个模块的界面都需要ViewModel,所以我把通用的成果抽象出来单独写成一个类BaseViewModel。代码如下:
首先是BaseNotify,通过MEF的结构函数导入来注入IRegionManager 与IEventAggregator 的实现。其子类也就可以直接使用了。
namespace Desktop.Infrastucture.ViewModel { public class BaseNotify:BaseNotificationObject { public List<SubscriptionToken> SubscriptionTokens = new List<SubscriptionToken>(); public readonly IRegionManager regionManager; public readonly IEventAggregator eventAggregator; public BaseNotify() { } [ImportingConstructor] public BaseNotify(IRegionManager regionManager,IEventAggregator eventAggregator) { this.regionManager = regionManager; this.eventAggregator = eventAggregator; } } }