有几天没有写博客了. 今天接着之前的部分继续写,模块间的通讯。在Prism框架中,我目前总结出来的模块间的通讯主要有两种。一种是基于接口的通讯,主要是使用UnityContainer的Resolve方法在模块外,获取模块内部的接口。然后通过接口向该模块传递数据或调用其方法,也可以注册其事件。这是一种弱藕合的通讯方式,因为两个模块之间都需要引用同一个接口。另一种通讯方式是使用Prism框架中的IEventAggregator来实现。该方式可以实现模块间的完全解藕,所以在此重要讲述。
IEventAggregator 从字面上看,他是一个事件聚合器。它将某一类型的事件注册到EventAggregator的静态集合中。在整个应用程序域中,供所有模块共享。其中一个事件触发,所有订阅了该事件的模块,都能接收到。
使用 IEventAggregator订阅事件的方法:
3 eventAggregator.GetEvent<CompositePresentationEvent<string>>();
4
5 evt.Subscribe(OnEventExecuted);
上面代码中的 eventAggregator是Prism框架在Bootstrapper的初始化中创建的,通过上面代码所在的类的构造函数传入。 Subscribe方法的作用是订阅事件,并且该事件的委托的格式只有一个string类型的型参( CompositePresentationEvent<string> )。当事件被触发后,当前模块中的OnEventExecuted方法被调用。
使用IEventAggregator触发事件的方法:
3 eventAggregator.GetEvent<CompositePresentationEvent<string>>();
4
5 evt.Publish("需要传递的内容");
上面的这段代码与前一段类似, eventAggregator是Prism框架在Bootstrapper的初始化中创建的一个静态对象。通过上要代码所在类的构造函数传入。Publish方法的作用是触发事件。事件触发后,所有订阅过该事件的模块都会收到该事件而作出相应的响应。 "需要传递的内容" 是事件触发时,传递的参数。将会被所有的模块接收到。通过使用 IEventAggregator 即可完成模块间的数据传递。并且模块之间完全解藕。
接下来,我将继续偿试和学习通过一个Region中的Module去控制另一个Region去加载指定的View。以此结束本阶段的Prism学习。谢谢大家的支持。