设计:如何通知控制器跨应用程序的数据修改

Ody*_*dys 14 c# .net-3.5 winforms data-synchronization

在基于mvc的大型系统中,有一些视图负责编辑显示该数据的数据和视图.

示例:UserManagementViewUserSelectionView.

在另一个子系统对相同数据进行更改之后,每个子系统都应该知道它是否需要数据更新,以便其控制器知道是否需要更新数据.

我对此的想法类似于观察者模式(有点集成在c#中),所有控制器都是听众,最终会得到通知,数据操作发生了.

BindingList<>例如提供一个ListChanged事件.类似地,可以为每个数据结构创建一个接口,并通知控制器有关更改的信息.这会增加开销(IMO),我发现这个解决方案很难在大型系统中维护,而且无论如何更新数据都不是解决方案.

哪种架构设计可以在这种场景中提供帮助?

Ben*_*yne 5

这个问题听起来像是在尝试使用没有模型部分的MVC.如果我误解了,编辑您的问题以包含实际用例(示例)可能有助于我们理解上下文.

但总的来说,控制器中不应该保留/存储任何内容.因此控制器中应该没有任何东西需要"更新"或"通知"(即:没有数据).相反,数据应位于管理所有数据的单独"模型"层中.然后,视图从模型层读取以获取该视图的任何数据.

有关快速复习的信息,请查看MVC上维基百科页面,其中包含一个很好的经典MVC流程图和有关组件交互的简单说明.

讨论示例

让我们试着设计一个例子来理解这个问题.

假设我的应用程序中有一个用户列表.此列表可能显示在:

  • 主管理列表视图
  • 管理员编辑用户视图
  • 用户的个人资料视图
  • 也许更多?

这些视图中的每一个都将从模型层请求数据并在屏幕上显示某些内容.

现在让我们说改变是针对一个用户的个人资料.这将通过控制器方法完成,该方法执行将一些更改应用于模型所需的任何工作.

我的理解是,您希望更新所有这些视图以反映该更改.这意味着视图需要从模型重新加载数据.它不应该从控制器本身获取这些数据,即使控制器触发此重新加载/刷新 - 或者控制器方法可能有助于从模型层查询.重要的是,您不是在整个应用程序中的多个控制器中维护数据的多个副本.持久性集中在模型层中.

在winforms的情况下,如果构建UI组件以识别该接口并相应地刷新,则模型层可能能够提供类似于所提及的INotifyPropertyChanged接口.但这是一种相当依赖平台的方法.

更加平台/上下文不可知的方法是已经提到的pub-sub(发布 - 订阅)模式.在这种情况下,对模型进行更改的每个控制器方法也会发布其更改的通知.该数据的任何视图都可以通过从模型层刷新/重新加载视图的数据来监听并响应此类通知.