是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的、更灵活、更易于维护并且更易于测试的WPF应用或是Silverlight应用以及Windows Phone 7应用。使用Prism可以使程序开发更趋于模块化,整个项目将由多个离散的、松耦合的模块组成,而各个模块又可以又不同的开发者或团队进行开发、测试和部署。目前Prism的最新版本是Prism 4,于2010年11月12日发布。Prism有很完整的文档以及丰富的示例程序。在这里我们仅针对于Silverlight程序的开发。
个人理解以及应用
WPF MVVM模式时为了解决各个ViewModel之间频繁的互相调用或者委托调用。以及非MVVM模式下各个类库组件之间通讯重复引用问题。
因为开发需要,同时解决结构体之不进行重复引用,情况下进行交互,因此采用微软最新提供的订阅发布开源库进行开发。发布者进行发布,不需要知道订阅者是谁,订阅者进行订阅不需要知道发布者是谁,通过 IEventAggregator 事件进行交互。事件发布以后,所有订阅过的对象都收到通知。类似于WCF与客户端交互时的回调函数功能,服务器处理完成后,通过回调函数来通知客户端处理完成。使用场景:首先需要引用Microsoft.Practices.Prism.dll类库
实例代码
以发送消息通知为例,收到新消息后,要通知对应的消息接收方,用于接收到消息之后的处理
定义 消息通知时间 ,用于订阅和发布事件使用
/// <summary>
/// Event Aggregator Repository 保证同一个EventAggregate调用 /// </summary> public class EventAggregatorRepository { public IEventAggregator EventAggregator;private static EventAggregatorRepository eventRespository = null;
private EventAggregatorRepository()
{ EventAggregator = new EventAggregator(); }public static EventAggregatorRepository GetInstance()
{ if (eventRespository == null) { eventRespository = new EventAggregatorRepository(); } return eventRespository; } }
/// <summary>
/// Send Notice Event string 是消息类型 可以是任意类型 object,string int /// </summary> public class SendNoticeEvent : CompositePresentationEvent<string> { }
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using Microsoft.Practices.Prism.Events;namespace Sample
{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); SetSubscribe(); }// 进行发布
public void SetPublish(string messageData) { EventAggregatorRepository.GetInstance().EventAggregator .GetEvent<SendNoticeEvent>() .Publish(messageData);}
// 订阅事件 public void SetSubscribe() { //订阅指定处理线程 // ThreadOption.UIThrea 页面线程处理 //ThreadOption.BackgroundThread 后台线程处理 //ThreadOption.PublisherThread 发布者线程处理EventAggregatorRepository.GetInstance().EventAggregator
.GetEvent<SendNoticeEvent>().Subscribe(ReceiveMessage, ThreadOption.UIThread, true);}
// Receive Message Opration public void ReceiveMessage(string messageData) { this.textReceiveMessage.Text = messageData; }// Send Data Event
private void button1_Click(object sender, RoutedEventArgs e) { SetPublish(this.textSendMessage.Text); } }}
常见异常
Prism的EventAggregator的事件订阅错误
在prism的EventAggregator事件订阅会指向一个方法,而该方法不能为private,否则该事件订阅将会无法方法该方法导致订阅错误!正确做法是将指向的方法改为public