把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>类来协助实现。