在 WPF MVVM 应用程序中使用事件聚合器在模型 类 之间进行通信是否可以接受?
Is it acceptable to use an event aggregator to communicate between model classes in WPF MVVM application?
我不确定 good/proper 在 WPF MVVM 应用程序中的模型 class 之间进行通信的方式是什么。现在,我的模型 classes 使用事件聚合器(特别是 Caliburn.Micro)与其他模型 classes 进行通信。
我不确定这是否被视为反模式,但感觉有些不对(请参阅下面的 note)。我喜欢事件聚合器提供的松散耦合,但我可以想象这种抽象可能会使代码更难阅读。但话又说回来,这似乎也是抽象的结果。
注意:此时正在使用同一个事件聚合器进行模型->模型class通信和视图模型<->模型class通信.我可以看出这是不可取的,如果我的问题的答案是肯定的,我可以轻松地创建一个单独的事件聚合器,专用于模型<->模型class 通信。
我了解事件聚合器的用处,尤其是对于视图模型<->视图模型通信和视图模型<->模型通信。但是,正在讨论的应用程序有一个相当复杂的模型,我不确定使用事件聚合器是否是模型<->模型通信的合适选择。
在 WPF MVVM 应用程序中使用事件聚合器在模型 class 之间进行通信是否可以接受?
如果是,我应该在我的应用程序中使用 2 个事件聚合器吗?
- 一个用于 viewmodel<->viewmodel 和 viewmodel<->model class 通信。
- 一个用于模型<->模型class 通信。
如果否,您会建议什么替代方案?
谢谢!
编辑: 我问这个问题已经两个多月了。在这段时间里,我对我的应用程序进行了一些重要的重新架构和重构。在此过程中,我设法消除了应用程序中 99% 的事件聚合器使用情况。我最终发现我对事件聚合器的大部分用法 不必要 (我有 s *** 吨)。我能够通过更好地组织我的应用程序来消除事件聚合器消息,并且我还用可观察对象(一个优秀的替代 IMO)替换了一些消息。所以,如果有人发现这是严重依赖事件聚合器的方式,请退后一步,想想你在做什么,因为可能有更好的方法!
显然,您可以使用多种方法在 类 之间进行通信,但我认为这是相当简单的 是的,很好。
您的事件聚合器基本上是一个消息总线,使用该概念在应用程序内进行通信并没有错。有些东西是视图模型而其他东西是模型这一事实并不真正相关。因此,我认为一个就足够了。
话虽如此,许多事件可能不是最佳选择(由于类型爆炸或魔术字符串,取决于您的框架,如果没有别的)。如果可以的话,我会在特定的接口(可能是那个,或者基于事件类型的东西)和方法名称上定向消息,并构建帮助程序 类 来解析消息并使用反射来调用适当的代码.这种方法在过去对我来说非常有效(尽管构建助手需要相当多的努力 类)。
要考虑的替代方法是为所有模型使用依赖项注入容器 类,因此它们只依赖于它们试图与之交谈的对象。这样做的主要缺点是将 DI 容器很好地集成到 WPF 中可能……很困难。
我不确定 good/proper 在 WPF MVVM 应用程序中的模型 class 之间进行通信的方式是什么。现在,我的模型 classes 使用事件聚合器(特别是 Caliburn.Micro)与其他模型 classes 进行通信。
我不确定这是否被视为反模式,但感觉有些不对(请参阅下面的 note)。我喜欢事件聚合器提供的松散耦合,但我可以想象这种抽象可能会使代码更难阅读。但话又说回来,这似乎也是抽象的结果。
注意:此时正在使用同一个事件聚合器进行模型->模型class通信和视图模型<->模型class通信.我可以看出这是不可取的,如果我的问题的答案是肯定的,我可以轻松地创建一个单独的事件聚合器,专用于模型<->模型class 通信。
我了解事件聚合器的用处,尤其是对于视图模型<->视图模型通信和视图模型<->模型通信。但是,正在讨论的应用程序有一个相当复杂的模型,我不确定使用事件聚合器是否是模型<->模型通信的合适选择。
在 WPF MVVM 应用程序中使用事件聚合器在模型 class 之间进行通信是否可以接受?
如果是,我应该在我的应用程序中使用 2 个事件聚合器吗?
- 一个用于 viewmodel<->viewmodel 和 viewmodel<->model class 通信。
- 一个用于模型<->模型class 通信。
如果否,您会建议什么替代方案?
谢谢!
编辑: 我问这个问题已经两个多月了。在这段时间里,我对我的应用程序进行了一些重要的重新架构和重构。在此过程中,我设法消除了应用程序中 99% 的事件聚合器使用情况。我最终发现我对事件聚合器的大部分用法 不必要 (我有 s *** 吨)。我能够通过更好地组织我的应用程序来消除事件聚合器消息,并且我还用可观察对象(一个优秀的替代 IMO)替换了一些消息。所以,如果有人发现这是严重依赖事件聚合器的方式,请退后一步,想想你在做什么,因为可能有更好的方法!
显然,您可以使用多种方法在 类 之间进行通信,但我认为这是相当简单的 是的,很好。
您的事件聚合器基本上是一个消息总线,使用该概念在应用程序内进行通信并没有错。有些东西是视图模型而其他东西是模型这一事实并不真正相关。因此,我认为一个就足够了。
话虽如此,许多事件可能不是最佳选择(由于类型爆炸或魔术字符串,取决于您的框架,如果没有别的)。如果可以的话,我会在特定的接口(可能是那个,或者基于事件类型的东西)和方法名称上定向消息,并构建帮助程序 类 来解析消息并使用反射来调用适当的代码.这种方法在过去对我来说非常有效(尽管构建助手需要相当多的努力 类)。
要考虑的替代方法是为所有模型使用依赖项注入容器 类,因此它们只依赖于它们试图与之交谈的对象。这样做的主要缺点是将 DI 容器很好地集成到 WPF 中可能……很困难。