迷失网络

如果你误读成“迷失公园”或“迷失侏罗纪”,那你可能真的迷失网络了。
随笔 - 88, 评论 - 1932, 引用 - 106

导航

关于

lostinet@lostinet.com这个油箱不能用了。因为空间没了,lostinet.com指向为127.0.0.1 。。。

标签

每月存档

最新留言

广告

 
把VS.NET2005Beta2下载了下来,一直都没有好好地去研究一下。
今天突然想到一个有意思的Idea,关于程序中数据的获取方式的。
反正想试试而已,于是顺便练习了一下范型。

通常做数据缓存的时候,都是依靠Cache来实现的。
其实DotNet的垃圾回收和WeakReference类就可以用来做缓存了。
测试的代码如下:
下面说说大概的做法:
首先,在某个Context下(当然作成全局也可以。)
有一个储存这些数据的地方,在例子中是SomeContext._itemtable
而SomeContext.GetDataItem则使用一种类似Provider的方式来获取数据。
当执行GetDataItem时,需要指定一个key
如果_itemtable不存在这个key,则需要访问Provder来获取这个数据。
如果_itemtable已经有了这个数据了,则直接返回该数据就OK了。

当然,_itemtable和里面的Dictionary都不是 Cache 类型的,
那么数据是怎样自动释放的呢?

这里关键就是_itemtable里并不引用T类型的对象,它只储存WeakReference.
当T对象没有被任何引用,并且内存紧张,DotNet进行回收的时候,~T()就会被调用。
~T()最好主动告诉SameContext.RemoveDataItem,它已经被回收啦。

所以,要执行SameContext.RemoveDataItem, T对象必须要引用着SameContext的实例,这使序列化有点麻烦。

当然如果要做序列化,那么就不要把_context也带过去了,~T()可以判断一下_context是否为空。
因为复制后对象并不是在_context._itemtable中的,并不存在回收的问题。

例子中还包含了一个 Products 属性。这个属性告诉了,怎样令Supplier本身是有生命的。
_products本身是为null的,一直到get_Products时,才开始使用_context来获取。
而且这个_products本身也算是缓存了。除非Supplier被回收了,否则就不需要重新访问数据库。

当然,基于这个也许能做很多更有意思的东西,例如基于这个来做一个ORM。
不过等有空的时候再完善这个模型吧。
 
-----------------------------------------------
如果希望目标的数据类型与这个模型无关,例如使用已有的数据类型,
那么可以使用后来做的DataPair<K,T>类来协助实现。

打印 | 张贴于 2005-04-22 17:59:00 | Tag:DotNet  迷失中  DotNet2学习

留言反馈

#回复: 基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收) 编辑
能否发一封到我邮箱?谢谢
2006-12-27 14:07:00 | [匿名用户:我考百试通]
#re:基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收) 编辑
基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收)ooeess
2005-05-30 11:55:00 | [匿名用户:转基因]
#re:基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收) 编辑
^_~,pretty good!csharpsseeoo
2005-05-08 14:33:00 | [匿名用户:电缆长度仪]
#re: 基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收) 编辑
这里说的Context是自定义的Context。

Context是一种概念,意思是你在某段代码时能得到的一些相关信息,HttpContext只是其中一种。

2005-04-25 23:20:00 | [匿名用户:Lostinet]
#re: 基于Context的数据缓存与属性的LazyLoad,一个范型的练习。(24日更新-DataPair能复活来延迟回收) 编辑
有个问题想请教您
上面说的HttpContext有某一个也可以是全局的是什么意思?
这个我知道很久了,但是一直没搞清楚单个和全局有什么区别。

按我的理解,每次访问服务器,IIS应该会产生一个HttpContext,同时也会产生HttpApplication吧?这个是针对某个客户端的?
那全局是什么意思?HttpApplication也是分全局和单一吧?

我糊涂了。。。。。。

2005-04-25 16:50:00 | [匿名用户:小东]
#re: 基于Context的数据缓存与属性的LazyLoad,一个范型的练习。 编辑
里面的
f (_context.Connection.State != ConnectionState.Open)
behavior = CommandBehavior.Default;
应该是
behavior = CommandBehavior.CloseConnection;
2005-04-22 19:01:00 | [匿名用户:Lostinet]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8