pub-sub事件的模式是发布者不应该知道或关心那里是否有任何订阅者,也不应该关心订阅者在那里做什么(来自 Brian Noyes的博客)
在Prism中使用EventAggregator的最佳做法是什么?目前,我有几个松散耦合并独立工作的模块.这些模块使用EventAggregator与其他模块进行通信.随着应用程序的增长,我对如何记录代码感到困惑.可能有许多模块发布事件和许多其他订阅它的事情,因为布赖恩说他们都不知道其他人究竟做了什么.在创建新模块时,如何在不破坏松耦合结构的情况下确保订阅某些XYZ事件?
如何使用EventAggregator直观地表示模块(某种图表)?
And*_*mes 19
您的帖子中有很多问题可以回答"这取决于您的应用程序",但我会尝试回答其中的一些问题.
我最经常使用EventAggregator看到的一件事就是滥用.许多人使用EventAggregator的方式使发布者和订阅者彼此依赖.这让我想到了我的第一点建议:
永远不要假设事件有任何子纤维.
EventAggregator对于发布其他视图可能感兴趣的事件非常有用.例如,在我们的应用程序中,我们允许用户更改某人的姓名.此名称可能会显示在应用程序中已打开的其他视图上(我们有一个选项卡式UI).我们的用例是我们希望在名称更改时更新这些UI,因此我们发布了一个"UserDataChanged"事件,以便打开视图可以适当地订阅和刷新其数据,但如果没有打开的视图对此数据感兴趣,没有订阅者通知.
在适当的情况下,通过EventAggregator事件来支持.NET事件
我经常看到的另一个错误是使用EventAggregator实现的业务流程,其中数据被发送到中央方,然后该方回复,全部使用EventAggregator.这会导致您可能想要避免的一些副作用.
我看到很多变化是从父视图到子视图的通信,反之亦然.像"TreeItemChecked"或"ListViewItemSelected"之类的东西.这是一种使用传统.NET事件的情况,但作者决定如果他们有锤子(EventAggregator),那么所有事件(事件)看起来都像钉子一样.
您询问有关EventAggregator的建模,我会这样说:EventAggregator只是特别之处在于它允许解耦并且不会创建对事件的强引用(避免内存泄漏等).除此之外,它实际上只是观察者模式的一个非常小的变化.然而,您正在建模Observers是如何在您尝试创建的任何类型的图表中为EventAggregator建模.
关于确保某个模块或其他模块订阅某个事件的问题:您没有.如果您需要确保有订户,则不应使用EventAggregator.在这些情况下,我建议在您的应用程序中运行的服务,模块可以从您的容器中获取并使用或其他类似的东西.
关于模块要记住的是,您应该能够正常地完全删除一个和其他应用程序功能.如果不是这种情况,您要么具有模块依赖性(最好避免,但可以理解),或者依赖模块应该合并为一个.