数据层的个性配置
可以很容易就知道,在Pet Shop 4中,客户个性配置的功能也是采用了工厂模式设计,故其结构和思路跟DAL中的数据访问功能很相似.
实现个性配置相关的文件如下表:
项目名称 | 文件名称 | 类(接口)名称 | 说明 |
ProfileDALFactory | 工厂 | ||
DataAccess.cs | DataAccess | 根据Web.congif文件中ProfileDAL结点中的profile项目决定实例化哪个类来完成个性化配置功能 | |
IProfileDAL | 接口 | ||
IPetShopProfileProvider.cs | IPetShopProfileProvider | 提供个性化配置要用到的全部方法的定义 | |
SQLProfileDAL | |||
PetShopProfileProvider.cs | PetShopProfileProvider | 针对SQLServer数据库,继承自IPetShopProfileProvider接口,实现其全部方法 | |
OracleProfileDAL | |||
PetShopProfileProvider.cs | PetShopProfileProvider | 针对Oracle数据库,继承自IPetShopProfileProvider接口,实现其全部方法 | |
Profile | 不明其具体功能(有待进一步研究) | ||
PetShopProfileProvider.cs | PetShopProfileProvider* | 不知道该类和上面几个类(接口)有什么关系 | |
XXXX | XXXX | ||
XXXX | ProfileProvider* | Profile项目中的PetShopProfileProvider类继承处该类,但目前不知该类的出处,对访类一无所知 |
注:以上*号标注部分有待进一步研究,如有熟知的朋友,谢谢告诉我一声.
数据层的缓存依赖
缓存依赖,是当用户本地缓存的数据在数据库(服务器)端发生变化时,数据库能够通知用户本地缓存,使得本得缓存能够重新读取新的数据到缓存中,实现缓存数据和数据库实际数据的同步,可以大大提高数据库访问的性能.
值得注意的是:PetShop4中只提供了SQLServer的数据缓存处理类:SqlCacheDependency类.
这里的缓存依赖同样采用了工厂模式.
项目名称 | 文件名称 | 类(接口)名称 | 说明 |
ICacheDependency | 缓存依赖的接口 | ||
IPetShopCacheDependency.cs | IPetSpopCacheDependency | 创建缓存实例,返回一个AggregateCacheDependency类,用来监控依赖项,如果依赖项对象发生了改变,则移除缓存Cache中的此对象,并读取新的缓存版本. | |
TableCacheDependency | 缓存依赖的实现 | ||
TableDependency.cs | TableDependency | 通过Web.config文件中的CacheDatabaseName和configKey,判断要缓存的数据库和键值(表),并添加到缓存中. | |
Product.cs,Item.cs,Category.cs | Product,Item,Category | 继承自TableDependency类,为父类提供数据库的表名称的参数. | |
CacheDependencyFactory | 工厂 | ||
DependencyAccess.cs | DependencyAccess | 通过判断Web.config文件中的CacheDependencyAssembly项目,返回缓存实例 | |
DependencyFacade.cs | DependencyFacade | 采用外观设计模式,该类是用户真正调用的类,用于包装复杂的调用,它只提供几个简单的GetCategoryDependency(),GetProductDependency(),GetItemDependency()方法,来调用DependencyAccess类 |
缓存依赖的实现机制
要实现缓存依赖,必须知道两大要素:一上DBMS如何知道哪个数据库需要缓存依赖,二是应用程序如何知道哪个数据库和表有缓存了.
解决第一个问题的方法是:在DBMS上注册数据库的缓存依赖.通过数据库注册工具aspnet_regsql来实现注册,在命令行状态下:
aspnet_regsql -S localhost -U mspetshop -P pass@word1 -d MSPetShop4 -et -t Catagory
各参数的说明如下表:
参数名称 | 说明 |
-S | 服务器名称 |
-U | 登录名 |
-P | 登录用户密码 |
-E | 使用Windows验证 |
-t | 对哪个表采用缓存依赖 |
-d | 对哪个数据库采用缓存依赖 |
-ed | 允许对数据使用缓存依赖 |
-dd | 禁止对用户使用缓存依赖 |
-et | 允许对某表使用缓存依赖 |
-dt | 禁止对某表使用缓存依赖 |
-lt | 列出使用使用缓存依赖的表 |
PetShop4中,数据库MSPetShop4中表AspNet_SqlCacheTableForChangeNotification就是保存缓存依赖表的.表内容如下图:
当表的内容发生变化时,相关的存储过程和触发器就让changeId自动加1,并修改缓存表和获取缓存表的信息.相关的存储过程如下表:
存储过程名称 | 说明 |
AspNet_SqlCachePollingStoredProcedure | 通知应用程序哪个表发生了变化 |
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure | 查询注册过的缓存依赖表 |
AspNet_SqlCacheRegisterTableStoredProcedure | 注册缓存表,并为缓存表添加触发器,以获取缓存表的变化 |
AspNet_SqlCacheUnRegisterTableStoredProcedure | 去除表的缓存依赖 |
AspNet_SqlCacheUpdateChangeIdStoredProcedure | 当表的数据变化时,让changeId自动加1 |
由上表可以得知,解决第一个问题的方法是:通过存储过程AspNet_SqlCachePollingStoredProcedure来通知,当然其中用到了触发器,以实现自动通知.
整个缓存注册的过程可以表示成下面的形式:
注册数据库缓存依赖->在数据库中自动添加缓存表->自动添加存储过程->存储过程添加触发器->通过触发器通知哪个表发生了变化->更新changeId.
另外还必须在Web.config中配置:
※※※※※※※※※※※※※※--我的程序人生--※※※※※※※※※※※※※※