使用事件聚合器时如何显式表达依赖关系?
How to express dependencies explicitly when using 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>
对的编译时检查。
- 此外,我的组合根将很难阅读,因为它缺少有关实际依赖层次结构的信息(可以用注释代替,但仍然如此)。
My concern is that implementing the EventAggregator solution seems to hide the dependencies between various classes, since their explicit dependency will be the EventAggregator.
嗯,这就是使用事件聚合器的目的。所有 classes 只知道事件聚合器本身,但他们什么都不知道,也不知道彼此之间有任何依赖关系。这意味着您可以修改一个 class 而不会影响另一个。
当然,它们确实依赖于事件聚合器,但这比保持每个发布者对每个订阅者的直接引用要好class。
显然,如果订阅者以某种方式依赖于此事件,则发布者需要在某个时候发布该事件。但即使您从订阅者那里强烈引用了发布者 class,这也是一样的。
这是我第一次使用事件聚合器,如果我忽略或误解了一些非常明显的事情,我们深表歉意。
在我的 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>
对的编译时检查。 - 此外,我的组合根将很难阅读,因为它缺少有关实际依赖层次结构的信息(可以用注释代替,但仍然如此)。
My concern is that implementing the EventAggregator solution seems to hide the dependencies between various classes, since their explicit dependency will be the EventAggregator.
嗯,这就是使用事件聚合器的目的。所有 classes 只知道事件聚合器本身,但他们什么都不知道,也不知道彼此之间有任何依赖关系。这意味着您可以修改一个 class 而不会影响另一个。
当然,它们确实依赖于事件聚合器,但这比保持每个发布者对每个订阅者的直接引用要好class。
显然,如果订阅者以某种方式依赖于此事件,则发布者需要在某个时候发布该事件。但即使您从订阅者那里强烈引用了发布者 class,这也是一样的。