EventAggregator 仅适用于 MVVM 中的 ViewModel?

2024-02-16

我了解到在 MVVM 设计中实现的事件聚合器模式可以帮助解耦 ViewModel 之间的通信。

我认为事件聚合器确实是个好主意。但转念一想,事件聚合器仅由 ViewModel 使用吗?模型可以在事件聚合器中发布和订阅事件吗?

通过这种方式,ViewModel 和 Model 之间的数据更改也许可以通过 EventAggregator 关联起来。这可能允许一个 ViewModel 从多个模型检索信息,而无需 ViewModel 存储对所有模型的引用。

如果我这样做,是否会导致整个架构变得混乱并最终成为反模式?最好的做法是什么?

Edit:

我想我应该解释一下我为什么问这个。我看到三个可能的问题:

First,因此使用 DI,我的 ViewModel 包装了 Model。然后我的 ViewModel 可以与我的模型进行通信。然而,反之则不然。因此,如果我的模型本身或外部发生了一些更改,它需要一种方法来通知其 ViewModel。

Second除了 ViewModel 必须与其他 ViewModel 进行通信之外,在我看来,Model 还必须像 ViewModel 一样与其他 Model 进行通信,甚至更多。这些导致我认为我可以将所有内容链接到 EventAggregator。

Third,我发现有些情况下单个ViewModel需要从多个Model中提取信息。但通过 ViewModel 的构造函数进行依赖注入,它只能从一个模型中读取。


您可能希望在多个地方使用事件聚合器:

  1. 在视图模型级别,以便视图模型可以发出可由其他感兴趣的对象接收的通知,或接收有关他们感兴趣的事件的消息。
  2. 在服务(或模型)级别,模型发送数据流。视图模型不再通过方法调用请求数据,而是简单地接收“新数据”事件。
  3. 如果您有多个服务向视图模型提供相同的数据,它可以将数据聚合到单个流中。
  4. 您有一个系统范围的事件(系统关闭),让您的视图模型和/或服务知道它们必须优雅地终止。这给了他们关闭的时间。

值得记住的是,使用事件聚合器有一些缺点:

  1. 它增加了一个层次或间接性,使代码更难阅读。映射事件发布者和订阅者可能会很麻烦,具体取决于您拥有的开发工具。
  2. 它需要大量的“脚手架”代码才能使其工作。如果过度使用,这可能会成为一种负担(您需要跟踪哪些事件做了什么,等等)。
  3. 如果对于简单的数据请求,用事件聚合器事件替换服务方法在大多数情况下是行不通的。每个方法调用需要 2 个事件(请求事件和响应事件)。您还必须小心发送错误的视图模型数据:如果视图模型 A 发送数据请求并且视图模型 A 和 B 收到其响应,那么您必须能够让视图模型 B 过滤掉响应。

一般来说,我不使用事件聚合器来提供服务到服务的通信(在我的主要工作项目中,我们有 20 个事件,其中只有 1 个是服务到服务)。这是因为我的大多数服务调用都是简单的一次性数据请求,而不是连续的更新流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EventAggregator 仅适用于 MVVM 中的 ViewModel? 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Jquery 点击事件在设备(ipad、iphone ..)中的 li 上不起作用

    Jquery 单击事件在设备中的 li 上不起作用 我尝试使用 click 和 touchstart 事件 但是使用 touchstart 时的问题是我无法向下滚动 div 当我尝试通过单击 li 向下滚动时 它会被选中 有没有办法使用任何
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • Java:d​​ouble:如何始终显示两位小数

    我在项目中使用双精度值 并且我希望始终显示前两位小数 即使它们为零 我使用此函数进行舍入 如果我打印的值是 3 47233322 它 正确地 打印 3 47 但是 例如 当我打印值 2 时 它会打印 2 0 public static do
  • 在 Servlet 中使用 CDI 注入

    我正在尝试 Inject a SessionScoped将 bean 放入过滤器 WebFilter public class IdentityFilter implements Filter Serializable Inject pri
  • 未找到 Java 类的消息正文编写器

    我刚开始使用 JAX RS 并编写了一个输出 json 对象的示例应用程序 但我有一个例外 这是我的代码 Path hello public class HelloWorldService GET Path query artist id
  • 那么我在这里谈论的是 SOA 吗?

    对于政府合同 我们将建议建立一个交通监控架构 我们将有以下组件 摄像机设置在感兴趣区域周围 摄像机将了解它们的位置和方向以及观看参数 GIS地图服务器 可以查询街道 建筑物等 一种算法接收原始视频和街道位置信息并输出汽车位置 另一种算法接收
  • 检查字符串是否包含列表中的元素的更智能方法 - python

    List top brands包含品牌列表 例如 top brands Coca Cola Apple Victoria s Secret items is a pandas DataFrame结构如下图所示 我的任务是填写brand na
  • Visual Studio 2008 类视图缺少类

    我刚刚将一个大型项目从旧版本的 Visual C 移植到 VS2008 并注意到类视图缺少一些我的类 查看解决方案视图 声明这些类的头文件存在 因此我希望在类视图中看到它们 排除某些类的任何原因 或者有什么方法可以刷新类视图以包含解决方案中
  • shiny,DT,styleColorBar 正值和负值的颜色不同?

    我已阅读 DT pdf 文档并进行了搜索 但 DT 包似乎不支持不同的颜色 我怎样才能达到下面图片链接所示的效果 谢谢 示例 正值和负值使用不同的颜色 https asymmetryobservations files wordpress
  • 将 copts/defines 传播到目标的所有依赖项

    我有一个项目 在一个相当复杂的构建系统中的单个工作空间中涉及多个构建文件 简而言之 我的目标 对于某些特定目标 我希望使用一组额外的属性来构建其所有递归依赖项 copts defines 与以任 何其他方式构建这些依赖项目标时相比 我还没有
  • 在 BIN 文件夹中找不到 ApacheJMeterTemporaryRootCA.crt

    我无法在 bin 文件夹中看到 ApacheJMeterTemporaryRootCA crt 文件 我正在运行 jmeter 5 2 1 我需要对此进行排序 以便能够将认证添加到对服务器的 API 调用中 请提供任何帮助或为我指明正确的方
  • 在 C# 中存储永远不会改变的静态数据的最佳方法是什么

    我有一个类将数据存储在 asp net c 应用程序中 并且永远不会改变 我真的不想将这些数据放入数据库中 我希望它保留在应用程序中 这是我在应用程序中存储数据的方法 public class PostVoteTypeFunctions p
  • 从html中提取标题标签

    我想从 html 字符串中提取标题标签的内容 我已经进行了一些搜索 但到目前为止我无法在 VB C 或 PHP 中找到此类代码 此外 这应该适用于大写和小写标签 例如应该与两者一起使用和 TITLE gt 谢谢 您可以为此使用正则表达式 但
  • 如何在 Haskell 中进行嵌套“循环”

    我正在查看一些 JAVA 代码 我想知道如何将其转换为 Haskell IntStream range 0 cookedWords length parallel forEach int i gt int A cookedWords i f
  • 在视图中播放框架配置值

    我如何访问该值application name from conf application conf在一个视图中 您可以使用以下代码示例来执行此操作 play configuration application name 另请参阅http
  • 如何使用 postData 过滤器刷新 jqGrid 搜索对话框

    我正在使用 jqGrid 到目前为止一切都运行良好 但现在我正在努力允许用户能够保存他们的搜索 以便他们以后可以检索它们和 或将它们应用到不同的网格 事实证明 节省实际上是最容易的部分 我可以根据指定的 postData 过滤器获取网格进行
  • Wix 卸载不删除文件,始终假定程序文件\myApp 文件夹

    我在使用 Wix 安装程序时遇到问题 并且不知道具体缺少什么 我已启用该对话框以允许用户选择自己的安装文件夹而不是默认的安装文件夹 如果我运行安装并保留默认的 Program Files MyApp 则应用程序安装没有问题 如果我随后卸载
  • 如何解决 Labview 加载冲突

    我正在 Labview 中开发一个数据采集程序 该程序使用多个平移台 相机 高速数字化仪和其他仪器 我正在一台计算机上开发该应用程序 并将其部署到另一台计算机上 开发计算机具有labview 2013 而要部署应用程序的计算机当前具有Lab
  • 在 Backbone.js 应用程序中设置全局 REST 根 url

    在backbone js中 您必须手动设置每个模型的rooturl 有没有一种方法可以将其设置在一个位置一次并且所有模型都会使用它 For eg api site com将是 REST 服务 但出于测试目的 它可能位于localhost 1
  • Apache NiFi:使用映射值将列添加到 csv

    使用 GetFile 处理器将 csv 导入 NiFi 工作流程 我有一列由 id 组成 每个id代表一个特定的字符串 大约有3个id 例如 如果我的 csv 包含 name age id John 10 Y Jake 55 N Finn
  • 我如何在 php 中获取上个月的名称[重复]

    这个问题在这里已经有答案了 可能的重复 php 中给定月份的下个月和上个月 https stackoverflow com questions 9172035 next and previous month from a given mon
  • EventAggregator 仅适用于 MVVM 中的 ViewModel?

    我了解到在 MVVM 设计中实现的事件聚合器模式可以帮助解耦 ViewModel 之间的通信 我认为事件聚合器确实是个好主意 但转念一想 事件聚合器仅由 ViewModel 使用吗 模型可以在事件聚合器中发布和订阅事件吗 通过这种方式 Vi