日期:2014-05-17  浏览次数:20365 次

缓存和反射的问题
想实现这样一个功能:
首先,执行数据库查询返回结果集;然后,通过反射遍历实体对象的所有属性,并将结果集的数据赋值到实体对象的各个属性上。

考虑到反射的性能比较差,所以想将反射得到的属性信息缓存起来,这样第二次查询的时候就不用反射了,根据缓存中的信息就知道一个实体对象有哪些属性,并为他们赋值。

反射和缓存(Cache)都没怎么接触过,但感觉思路应该没多大问题。

问题:
1.假设XXX.dll下有个ClassA,ClassA下有两个属性PropertyA和PropertyB。
2.第一次执行查询的时候通过反射就知道了ClassA有两个属性,并缓存起来。
3.接着我在代码了修改ClassA,增加了属性PropertyC,然后编译生成新的XXX.dll,在不重启iis的情况下更新了XXX.dll。
更新后,实际上ClassA已经有三个属性了,但是缓存里还是只有两个属性,怎么办? 我在程序里如果知道XXX.dll已经被更新了?

不知道有没有描述清楚,还请大家帮个忙,谢谢!

------解决方案--------------------
探讨
3.接着我在代码了修改ClassA,增加了属性PropertyC,然后编译生成新的XXX.dll,在不重启iis的情况下更新了XXX.dll。
更新后,实际上ClassA已经有三个属性了,但是缓存里还是只有两个属性,怎么办? 我在程序里如果知道XXX.dll已经被更新了?

------解决方案--------------------
正常情况下,应用程序池会重启,dll会重新加载。
------解决方案--------------------
1:反射获取公共属性时,先从缓存取,缓存找不到在通过反射获取。
2:至于你说类里新增了属性的问题,你只需清空一下对应的缓存就行了。
当然你可以先把程序都跑一遍,不要把创建缓存的工作交给用户。
------解决方案--------------------
探讨
引用:
3.接着我在代码了修改ClassA,增加了属性PropertyC,然后编译生成新的XXX.dll,在不重启iis的情况下更新了XXX.dll。
更新后,实际上ClassA已经有三个属性了,但是缓存里还是只有两个属性,怎么办? 我在程序里如果知道XXX.dll已经被更新了?


那两个Assembly根本不是一个。

.net允许对同名的dll但是版本根本不同的,重……