在系列(一)中,我简单的介绍了数据的提取过程,这次将简单的介绍下缓存依赖。
具体的项目文件可以参考我的github仓库
缓存依赖使用前提
在某些情况下,我们可能会不断的查询数据库,当查询的次数较多并且数据库表内容较多时,网页的加载速度将会慢的令人发指。因此当访问此数据库表的用户较多或程序访问此数据库表的频率较高时,我们可以建立数据库缓存依赖来改善加载速度。
数据库缓存依赖需要首先得到SQL数据库支持,可以参考李天平老师的博文中第二步做法进行实现。
缓存依赖的结构
和PetShop的DAL结构差不多,缓存依赖也分为缓存依赖类接口(ICacheDependency),缓存依赖实现类(TableCacheDependency)和缓存依赖类的工厂类(CacheDependencyFactory)。
缓存依赖类接口
接口文件非常简单,仅仅要求实现类实现GetDependency()方法,代码如下:
using System.Web.Caching;
namespace FWSync.ICacheDependency
{
public interface IFWSyncCacheDependency
{
AggregateCacheDependency GetDependency();
}
}
缓存依赖实现类
在缓存依赖实现类中,TableDependency.cs是所有实现类的基类,其实现了接口中的方法,并且增加了一个读取缓存依赖数据库的方法。
同时,我们还应该为相应的数据库表建立缓存依赖实现类,具体代码如下:
TableDependency.cs
using System.Web.Caching;
using System.Configuration;
namespace FWSync.TableCacheDependency
{
public abstract class TableDependency : FWSync.ICacheDependency.IFWSyncCacheDependency
{
protected char[] configurationSeparator = new char[] { ',' };
protected AggregateCacheDependency dependency = new AggregateCacheDependency();
protected TableDependency(string configKey)
{
string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
string tableConfig = ConfigurationManager.AppSettings[configKey];
string[] tables = tableConfig.Split(configurationSeparator);
foreach (string tableName in tables)
dependency.Add(new SqlCacheDependency(dbName, tableName));
}
public AggregateCacheDependency GetDependency()
{
return dependency;
}
}
}
Device.cs
using System.Web.Caching;
namespace FWSync.TableCacheDependency
{
public class Device : TableDependency
{
public Device() : base("DeviceTableDependency") { }
}
}
缓存依赖类工厂类
这里工厂类的作用依然是创建相应缓存依赖类的实例,作为一种固定格式来使用即可。
工厂类包含两个类,代码分别如下:
DependencyAccess.cs
using System;
using System.Reflection;
using System.Configuration;
using FWSync.ICacheDependency;
namespace FWSync.CacheDependencyFactory
{
public static class DependencyAccess
{
private static readonly string path = ConfigurationSettings.AppSettings["Cache"];
private static IFWSyncCacheDependency LoadInstance(string className)
{
string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
string fullyQualifiedClass = path + "." + className;
return (IFWSyncCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
}
public static IFWSyncCacheDependency CreateDependency()
{
string className = path + ".TableDependency";
return (IFWSyncCacheDependency)Assembly.Load(path).CreateInstance(className);
}
public static IFWSyncCacheDependency CreateDeviceDependency()
{
return LoadInstance("Device");
}
}
}
DependencyFacade.cs
using System.Configuration;
using System.Web.Caching;
using System.Collections.Generic;
using FWSync.ICacheDependency;
namespace FWSync.CacheDependencyFactory
{
public static class DependencyFacade
{
private static readonly string path = C