这是我第一次使用Event Aggregator,如果我忽略或误解了一些非常明显的东西,我会道歉。
在我的MVVM项目中,我有多个依赖于相同的模型类,定期更新数据,他们需要对数据的变化作出反应。 (其中一些类基于此依赖关系生成自己的数据,这些依赖关系也需要发送到其他类。)
我没有将这个相同的依赖项注入多个模型类并使用INotifyPropertyChange
/ PropertyChanged
,而是希望使用Caliburn Micro的EventAggregator
来发布和处理刷新数据。
我担心的是,实现EventAggregator
解决方案似乎隐藏了各个类之间的依赖关系,因为它们的显式依赖关系将是EventAggregator
。
所以,我的作品根目录中的以下内容(显然只是一个示例代码):
_dependency = new Dependency();
_dependent1 = Dependent1(_dependency);
_dependent2 = Dependent2(_dependency);
...
如果我正确的话,将成为以下内容:
_eventAggregator = new EventAggregator();
_dependency = new Dependency(_eventAggregator); // Publishes
_dependent1 = Dependent1(_eventAggregator); // Handles
_dependent2 = Dependent2(_eventAggregator); // Handles
...
备注:
IHandle<T>
接口,可用于表达某些类型对象的处理。IPublish<T>
界面来明确表达某些类型对象的发布。即便如此,也不会构成匹配IPublish<T>
- IHandle<T>
对的编译时检查。答案 0 :(得分:1)
我担心的是,实现EventAggregator解决方案似乎隐藏了各个类之间的依赖关系,因为它们的显式依赖关系将是EventAggregator。
嗯,这就是使用事件聚合器的目的。所有类只知道事件聚合器本身,但它们不知道任何内容或彼此之间存在任何依赖关系。这意味着您可以修改一个类而不影响另一个类。
当然,他们确实依赖于事件聚合器,但这比直接引用每个发布者类的每个订阅者更好。
显然,如果订阅者以某种方式依赖于此事件,则发布者需要在某个时刻发布事件。但即使您对订阅者的发布者类有强烈的引用,这也是一样的。