我正在研究一个中心类(主题)将包含大量数据的项目。将有一个使用 .net ajax 显示此数据的 aspx 页面。当从任何页面更新主题时,我希望所有打开的页面都更新。我将为此使用观察者模式。问题是,我是让实际的 aspx 页面成为观察者,还是有更好的方法来做到这一点?
3 回答
在这种情况下,观察者模式没有意义。
Web(和 ASP.NET)通过请求(例如来自 Web 浏览器)和响应(例如来自 Web 服务器)的方式工作。
观察者模式要求主体(例如 Web 服务器)维护对其观察者(例如 Web 浏览器)的引用并将通知更新推送给它们。显然,这不适用于 Web 浏览器-Web 服务器场景。
我同意 Sergio 的观点,最好的方法可能是让您的客户端(Web 浏览器)定期检查资源(Web 服务器)的更新。最简洁的方法是 AJAX 调用。
一个很好的例子是 Gmail,新邮件在服务器上收到后很快就会出现在收件箱中,而无需用户提出明确的请求。这是通过 AJAX 调用来完成的,该调用会定期检查 Gmail 服务器是否有新邮件。
更新(2012.03.01):-
最近的发展使得将数据从 Web 服务器推送到客户端成为一种更现实的可能性,例如SignalR。
塞尔吉奥是对的,在某种程度上你也是。通过 Asp.Net AJAX 实现这一点的最简单方法是使用 AJAX 计时器控件,但您当然不想在所有页面中复制它。更好的方法是将该功能包装到母版页中,或者甚至创建从 Page 派生的基本页。
查看Timer Control 上的 MSDN 页面,以及一个不错的视频教程。
作为设计的旁注,我不一定将实际的观察者代码放在你的代码后面。相反,您希望将这些事件转发到某个底层模型。这个想法是你的代码背后只负责与 UI 相关的东西和实现它的逻辑。本质上是 MVP/MVP 中的V。
此外,考虑到您正在谈论没有真实状态的单个 HTTP 响应/请求周期,我不确定“实际”观察者模式在 Web 上下文中的应用效果如何。
我不熟悉观察者模式,但你必须这样做的唯一方法是在页面加载时放置一个 javascript 无限循环,每 X 秒调用服务器上的 AJAX 方法以检查更新。