国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

解讀asp.net中的觀察者模式_.Net教程

2024-07-10 12:51:19
字體:
來源:轉載
供稿:網友

推薦:解讀Asp.net教程:設計IP地址屏蔽功能
出于安全考慮,幾乎每個動態網站都具備IP地址屏蔽功能,而網上流傳的很多關于該功能的教程大都采用字符串保存和驗證IP地址,我認為這是不太科學的,我試圖找到最佳的設計方案。“I

在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://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
private void ReciveMessage(object sender, DataEventArgs e)
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
MessageList.Add(e.Message);
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/None.gif[/img]

Ok,需要具備的元素我們都寫好了,但是如何讓它們工作起來?如果使Winform程序,那將毫無懸念。

分析:我們碰到的問題

第一個問題:當客戶端發送一個數據包,我們是實例化一個新的Monitor么?如果是,哪么每次實例化一個全新的Monitor,所有在它上面訂閱的事件將全部消失了,如果不是那這個Monitor將如何存在呢?總不能真空吧,兩個http請求之間如何保存數據呢?不過再把需求一讀,好像整個應用程序中就只需要也只能有一個這樣的Monitor呢,該是單件模式上場的時候了。

在上面的Monitor的實現中添加下面的代碼:

以下為引用的內容:
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/None.gif[/img]
private static Monitor _instance = null;
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/None.gif[/img]public static
Monitor Current
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
get
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
if (_instance == null)
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
_instance = new Monitor();
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
return _instance;
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}

但是本系統存在多個客戶端,所以為了避免多線程造成問題,還是來Double Check一下吧,修改上面的代碼如下:

以下為引用的內容:
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/None.gif[/img]
public static Monitor Current
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
get
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
object o = new object();
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
if (_instance == null)
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
lock (o)
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img]
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
[img]http://m.survivalescaperooms.com/Images/dot.gif[/img]{
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
if (_instance == null)
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
_instance = new Monitor();
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/InBlock.gif[/img]
return _instance;
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]
}
[img]http://m.survivalescaperooms.com/Images/OutliningIndicators/None.gif[/img]

(PS:為什么使用單件就可以跨請求保存實例了呢?因為這里使用了一個static member保存Monitor的引用,static member在.net的GC里面是被作為Root的,詳細內容請參見框架程序設計那本書)

分享:.Net教程之HTTP狀態碼200,301,302
跳轉非常常用,在哪里都一樣,這里的一些說明和用法也如此,不止適用于asp.net,其他語言也會用得到。跳轉的目的本來很簡單,就是當用戶或系統需要時從一個頁面轉向另一個頁面,但自從有了

共3頁上一頁123下一頁
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芜湖县| 九江市| 蓬莱市| 扎兰屯市| 湖南省| 万源市| 武平县| 宁强县| 淄博市| 揭阳市| 广丰县| 新建县| 潼南县| 醴陵市| 公主岭市| 五家渠市| 榆中县| 德庆县| 宝坻区| 石城县| 临泽县| 慈利县| 中卫市| 桐乡市| 东乡县| 龙山县| 辰溪县| 崇州市| 西丰县| 石景山区| 望城县| 柘荣县| 奉贤区| 阜新市| 广灵县| 北流市| 北流市| 邹平县| 南川市| 芦溪县| 荆州市|