日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ESBasic 可復(fù)用的.NET類庫(12) -- 對(duì)象管理

系統(tǒng) 1717 0

1. 緣起:

我們經(jīng)常需要對(duì)一些動(dòng)態(tài)對(duì)象進(jìn)行管理,最常見的例子就是在線用戶管理。當(dāng)一個(gè)用戶成功登陸到服務(wù)器后,我們就需要將其管理起來;當(dāng)他退出后,就不再需要再管理他了。這就是所謂動(dòng)態(tài)對(duì)象的含義,這些對(duì)象并不是一直需要被管理,只有當(dāng)其被激活后,才需要被管理。它們總是在“激活”狀態(tài)和“非激活”狀態(tài)之間不斷地切換。

我設(shè)計(jì)了對(duì)象管理器 ESBasic.ObjectManagement.Managers.IObjectManager 來管理類似的動(dòng)態(tài)對(duì)象。這個(gè)類是 ESBasic 提供的眾多對(duì)象管理容器中的非常簡單的一個(gè),無論是功能還是實(shí)現(xiàn)。

對(duì)象管理器的形象示意圖如下:

ESBasic 可復(fù)用的.NET類庫(12) -- 對(duì)象管理器 IObjectManager

2. 適用場合:

如果你的系統(tǒng)有類似以下的需求,就可以使用 IObjectManager

(1) 將要被管理的每個(gè)動(dòng)態(tài)對(duì)象都有唯一的 ID

(2) 對(duì)象經(jīng)常要被添加到管理器中和經(jīng)常要從管理器中移除。

(3) 管理器在多線程的環(huán)境下被使用。

3 .設(shè)計(jì)思想與實(shí)現(xiàn)

IObjectManager 的接口定義如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public interface IObjectManager < TPKey,TObject >
{
event CbGeneric < TObject > ObjectRegistered;
event CbGeneric < TObject > ObjectUnregistered;

int Count{ get ;}

/// <summary>
/// Add如果已經(jīng)存在同ID的對(duì)象,則用新對(duì)象替換舊對(duì)象。
/// </summary>
void Add(TPKeykey,TObjectobj);

void Remove(TPKeyid);
void Clear();
bool Contains(TPKeyid);

/// <summary>
/// Get如果不存在,則返回default(TObject)。
/// </summary>
TObjectGet(TPKeyid);

IList
< TObject > GetAll();
IList
< TPKey > GetKeyList();
IList
< TPKey > GetKeyListByObj(TObjectobj);
}

這個(gè)接口相當(dāng)簡單,就像是一個(gè) IDictionary 的加強(qiáng)版。是的,你確實(shí)可以這樣理解,把 IObjectManager 當(dāng)作一個(gè)更好用的字典。而且 ObjectManager 的實(shí)現(xiàn)也的確是使用 IDictionary 來的。

但是它與 IDictionary 的區(qū)別――也是它更好用的地方在于:

(1) 它是多線程安全的,可以再多線程的環(huán)境下被使用。與 IDictionary 相比,這應(yīng)該是最大的一個(gè)易用點(diǎn)。

(2) Add 方法采用的是覆蓋原則――如果同 Key 的對(duì)象已經(jīng)存在,則用新對(duì)象覆蓋舊的對(duì)象。當(dāng)然,如果你不想直接覆蓋,再調(diào)用 Add 方法之前可以先調(diào)用 Contains 方法檢測一下。

(3) 當(dāng)調(diào)用 Remove 方法從管理器中移除一個(gè)不存在的對(duì)象時(shí),并不會(huì)拋出異常,而是直接返回。

(4) GetKeyList 方法返回的是鍵值的拷貝,這樣在對(duì)返回列表做 foreach 遍歷時(shí),即使內(nèi)部字典中的元素發(fā)生了增加 / 刪除也不會(huì)影響遍歷操作。

(5) 當(dāng)內(nèi)部集合的元素發(fā)生增加 / 刪除時(shí),以事件( ObjectRegistered 事件和 ObjectUnregistered 事件)的方式通知外部。

4. 使用時(shí)的注意事項(xiàng)

IObjectManager 的兩個(gè)泛型參數(shù)都是沒有泛型約束的,也就是說 TObject 可以是值類型。當(dāng) TObject 是值類型時(shí),如果使用一個(gè)不存在的 ID 去調(diào)用 Get 方法,則不會(huì)返回 null ,因?yàn)橹殿愋筒豢赡転? null ,這時(shí)將返回 default(TObject) 。而這樣的結(jié)果也許并不是你所期望的。

所以,如果你的 TObject 為值類型,又不想出現(xiàn)上面的情況,那么在調(diào)用 Get 方法之前有必要先調(diào)用 Contains 方法確認(rèn)一下對(duì)象是否真的存在――這就像在使用 IDictionary 一樣。

5. 擴(kuò)展

對(duì)象管理器 IObjectManager 暫時(shí)沒有任何擴(kuò)展。

注:ESBasic源碼可到 http://esbasic.codeplex.com/ 下載。
ESBasic討論:37677395
ESBasic開源前言

ESBasic 可復(fù)用的.NET類庫(12) -- 對(duì)象管理器 IObjectManager


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 淳安县| 咸丰县| 赫章县| 平昌县| 西平县| 宝应县| 济源市| 和平县| 易门县| 米易县| 农安县| 普安县| 噶尔县| 依兰县| 宁强县| 临澧县| 阳春市| 彭水| 湛江市| 昌平区| 安泽县| 湘乡市| 呼和浩特市| SHOW| 蛟河市| 锡林浩特市| 上虞市| 连山| 通河县| 荣昌县| 铁岭市| 祁阳县| 永春县| 伽师县| 莆田市| 玉龙| 克什克腾旗| 贺兰县| 普兰县| 玉门市| 和龙市|