ESBasic 可复用的.NET类库(12) -- 对象管理

系统 1387 0

1. 缘起:

我们经常需要对一些动态对象进行管理,最常见的例子就是在线用户管理。当一个用户成功登陆到服务器后,我们就需要将其管理起来;当他退出后,就不再需要再管理他了。这就是所谓动态对象的含义,这些对象并不是一直需要被管理,只有当其被激活后,才需要被管理。它们总是在“激活”状态和“非激活”状态之间不断地切换。

我设计了对象管理器 ESBasic.ObjectManagement.Managers.IObjectManager 来管理类似的动态对象。这个类是 ESBasic 提供的众多对象管理容器中的非常简单的一个,无论是功能还是实现。

对象管理器的形象示意图如下:

ESBasic 可复用的.NET类库(12) -- 对象管理器 IObjectManager

2. 适用场合:

如果你的系统有类似以下的需求,就可以使用 IObjectManager

(1) 将要被管理的每个动态对象都有唯一的 ID

(2) 对象经常要被添加到管理器中和经常要从管理器中移除。

(3) 管理器在多线程的环境下被使用。

3 .设计思想与实现

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如果已经存在同ID的对象,则用新对象替换旧对象。
/// </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);
}

这个接口相当简单,就像是一个 IDictionary 的加强版。是的,你确实可以这样理解,把 IObjectManager 当作一个更好用的字典。而且 ObjectManager 的实现也的确是使用 IDictionary 来的。

但是它与 IDictionary 的区别――也是它更好用的地方在于:

(1) 它是多线程安全的,可以再多线程的环境下被使用。与 IDictionary 相比,这应该是最大的一个易用点。

(2) Add 方法采用的是覆盖原则――如果同 Key 的对象已经存在,则用新对象覆盖旧的对象。当然,如果你不想直接覆盖,再调用 Add 方法之前可以先调用 Contains 方法检测一下。

(3) 当调用 Remove 方法从管理器中移除一个不存在的对象时,并不会抛出异常,而是直接返回。

(4) GetKeyList 方法返回的是键值的拷贝,这样在对返回列表做 foreach 遍历时,即使内部字典中的元素发生了增加 / 删除也不会影响遍历操作。

(5) 当内部集合的元素发生增加 / 删除时,以事件( ObjectRegistered 事件和 ObjectUnregistered 事件)的方式通知外部。

4. 使用时的注意事项

IObjectManager 的两个泛型参数都是没有泛型约束的,也就是说 TObject 可以是值类型。当 TObject 是值类型时,如果使用一个不存在的 ID 去调用 Get 方法,则不会返回 null ,因为值类型不可能为 null ,这时将返回 default(TObject) 。而这样的结果也许并不是你所期望的。

所以,如果你的 TObject 为值类型,又不想出现上面的情况,那么在调用 Get 方法之前有必要先调用 Contains 方法确认一下对象是否真的存在――这就像在使用 IDictionary 一样。

5. 扩展

对象管理器 IObjectManager 暂时没有任何扩展。

注:ESBasic源码可到 http://esbasic.codeplex.com/ 下载。
ESBasic讨论:37677395
ESBasic开源前言

ESBasic 可复用的.NET类库(12) -- 对象管理器 IObjectManager


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论