asp.net中的观察者模式


在asp.net中实现观察者模式?难道asp.net中的观察者模式有什么特别么?嗯,基于Http协议的Application难免有些健忘,我是这样实现的,不知道有没有更好的办法?

先谈谈需求吧,以免陷入空谈

最近一个Case, 这样的需求:很多客户端不断的向Web Application提交数据,管理员进入Web的管理页面可以即时的看到这些数据,有多个管理员可以同时浏览,且管理员浏览的数据从管理员开始监视那个时刻起,不能显示以前的数据。从这个场景一看,明显的观察者模式,管理员开始监视时,订阅数据,数据到达的时候向所有订阅了数据的管理员广播数据。

需求如下图:

 

有了发布者还需要订阅者,我们实现管理员类,来订阅数据

public class Admin
   {
     /**//// <summary>
     /// 用这个保存所有收到的数据
     /// </summary>
     public IList<string> MessageList
     { get; set; }
     public Admin(Monitor monitor)
     {
         MessageList = new List<string>();
         monitor.DataIn += new EventHandler< DataEventArgs>(ReciveMessage);
     }
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
     private void ReciveMessage(object sender, DataEventArgs e)
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]        
MessageList.Add(e.Message);
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
     }
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]
   }
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]

Ok,需要具备的元素我们都写好了,但是如何让它们工作起来?如果使Winform程序,那将毫无悬念。

分析:我们碰到的问题

第一个问题:当客户端发送一个数据包,我们是实例化一个新的Monitor么?如果是,哪么每次实例化一个全新的Monitor,所有在它上面订阅的事件将全部消失了,如果不是那这个Monitor将如何存在呢?总不能真空吧,两个http请求之间如何保存数据呢?不过再把需求一读,好像整个应用程序中就只需要也只能有一个这样的Monitor呢,该是单件模式上场的时候了。

在上面的Monitor的实现中添加下面的代码:

[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]
private static Monitor _instance = null;
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]public static
Monitor Current
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]
[img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
   get
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]  
[img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
     if (_instance == null)
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
       _instance = new Monitor();
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
     return _instance;
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
   }
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}

但是本系统存在多个客户端,所以为了避免多线程造成问题,还是来Double Check一下吧,修改上面的代码如下:

[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]
public static Monitor Current
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]    
[img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
         get
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
         [img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]          
object o = new object();
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
           if (_instance == null)
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
           [img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]            
lock (o)
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
             [img]http://www.cnblogs.com/Images/dot.gif[/img]{
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]                
if (_instance == null)
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]
                   _instance = new Monitor();
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
             }
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
           }
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]          
return _instance;
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
         }
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]
     }
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]

(PS:为什么使用单件就可以跨请求保存实例了呢?因为这里使用了一个static member保存Monitor的引用,static member在.net的GC里面是被作为Root的,详细内容请参见框架程序设计那本书)



相关阅读:
将Oracle数据库中的表设为只读
让Windows2003运行在内存下
用JavaScript仿PS里的羽化效果代码
VBS教程:属性-Files 属性
Access 和 SQL Server数据类型的比较
XML 视图中的 ID 属性
mysql免安装制作使用说明
NT下基于邮件服务软件(IMAIL)的发送程序
"使用链接表的额外特性尚未激活.."修正办
Windows Vista安装详细(图解)流程
五种MySQL数据库可靠性方案的分析和比较
jquery select选中的一个小问题
ASP采集入库生成本地文件的几个函数
建立HTML字符串的最快速方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 14年100字一年级小学作文名人传 领导班子和党员干部撰写对照检查材料的写作指导意见 没有脚的鸟 小学六年级作文550字:石头的自白 暑假工作实践报告 励志故事《要知道自己箭靶的位置》 改过的儿子 《穷人》续写作文400字 叹春作文400字 微笑着沿着秋天的阳光行走 夜晚没有月亮 春雨150字 做一个优秀的小学生 月亮湾作文 宇宙中的三兄弟作文600字 高中高三作文1200字:中国,朝前走 小学五年级作文500字:骄傲的钢笔 我想说、我知道我的选择是正确的 竞聘正科员演讲稿 励志短篇演讲稿 初中初三作文800字:看漫画有感 矿业局工作思路_企划文案 银行营业部工作重点 2016退伍军人年思想汇报 妹妹的第二次手术作文450字 走进了才知道作文900字 记者事迹材料演讲稿 大四学生自我鉴定范文精选 小学三年级作文500字:参观三号井 英文简历模板系列3:应聘后勤英文简历 广东科学中心作文1100字 小暑问候语 毕业絮语 英语电影经典语句 我认为纸上谈兵没什么作用 冬游_难忘的冬游作文 西藏阿里导游词 爱情谜语及答案 致“梦幻雪天使”一首诗作文200字 闲适隐逸诗 81建军节的诗歌:八一建军节快乐 颓废的我 初中初一作文700字:秋风,落叶,我的牵挂 小学生秋季开学典礼主持词2016 回忆总是凄凉 坚信一个理念我会开拓一片天空 党风廉政讲座:开创党风廉政建设和反腐败斗争新局面 把握今生,莫想来世 明月——月光流淌 捐款作文800字 就算时间累了也不会向我臣服

Copyright © 2016 phpStudy |