如何在使用Event Aggregator时显式表达依赖关系?

时间:2017-04-05 10:14:23

标签: c# wpf mvvm caliburn.micro eventaggregator

这是我第一次使用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
...

备注:

  • Caliburn Micro包含一个通用IHandle<T>接口,可用于表达某些类型对象的处理。
  • 但它没有相应的IPublish<T>界面来明确表达某些类型对象的发布。即便如此,也不会构成匹配IPublish<T> - IHandle<T>对的编译时检查。
  • 另外,我的作文根将难以阅读,因为它缺少有关实际依赖关系层次结构的信息(可以用注释代替,但仍然如此)。

1 个答案:

答案 0 :(得分:1)

  

我担心的是,实现EventAggregator解决方案似乎隐藏了各个类之间的依赖关系,因为它们的显式依赖关系将是EventAggregator。

嗯,这就是使用事件聚合器的目的。所有类只知道事件聚合器本身,但它们不知道任何内容或彼此之间存在任何依赖关系。这意味着您可以修改一个类而不影响另一个类。

当然,他们确实依赖于事件聚合器,但这比直接引用每个发布者类的每个订阅者更好。

显然,如果订阅者以某种方式依赖于此事件,则发布者需要在某个时刻发布事件。但即使您对订阅者的发布者类有强烈的引用,这也是一样的。