FrameworkGen - 配置实体缓存
了解如何利用 FrameworkGen 中的缓存支持。
引言
对于那些不熟悉的人来说,FrameworkGen 是一个 .NET ORM,用于为 Windows 和 Web 应用程序生成数据访问持久性代码。 FrameworkGen 缺少的一个功能是内置的实体缓存能力。该工具的 v4.0 版本现在提供了配置实体缓存的方式。本文将向您展示如何使用新的缓存功能。
背景
几年来,我一直在使用 FrameworkGen 为企业级项目生成 C# 类库和针对 SQL 数据库的 SQL 存储过程。它一直是我的首选工具,因为它为业务组件、数据组件和实体生成单独的类库。生成的代码易于使用且易于理解。
在 FrameworkGen 的早期版本中,如果需要实体缓存,您需要在单独的类或可能是一个 Facade 层中自行编写实体缓存代码。 FrameworkGen v4.0 通过 CachingProvider
类提供的内置缓存功能使这变得更加简单。
缓存配置
在 FrameworkGen 中启用实体缓存后(可以通过选择 AddEntityCachingSupport
首选项来启用),将创建以下 app.config 文件,该文件位于解决方案项目的文件夹中。 app.config 文件包含以下设置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Entities_CommandTimeout" value="30" />
<add key="Entities_DataComponentsInversionOfControlFilePath"
value="C:\FrameworkGen\Working\SolutionItems\
DataComponentsInversionOfControl.config" />
<add key="Entities_EntityCachingEnabledDefault" value="false" />
<add key="Entities_CacheDurationInMinutes" value="1440" />
<add key="Entities_CachingProviderFullTypeName"
value="ElencySolutions.ESSurvey.BusinessComponents.CachingProvider" />
<add key="Entities_SqlCacheDependenciesEnabled" value="false" />
<add key="Entities_SqlCacheDependenciesDatabaseName" value="ESSurvey" />
</appSettings>
<connectionStrings>
<add name="ESSurvey_Connection"
connectionString="server=TEST-PC\SQLEXPRESS;database=ESSurvey;
User ID=sa;Password=v3ry53cur3!;Application Name=ElencySolutions.ESSurvey"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<!-- the following section is only relevant if sql cache dependencies are enabled -->
<caching>
<sqlCacheDependency pollTime="10000" enabled="true">
<databases>
<add connectionStringName="ESSurvey_Connection" name="ESSurvey" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
与缓存相关的设置是
Entities_EntityCachingEnabledDefault
- 这指定是否在所有业务对象上启用缓存。Entities_CacheDurationInMinutes
- 这指定实体对象应存储在缓存中的默认缓存持续时间。Entities_CachingProviderFullTypeName
- 这允许用户指定一个应该用于缓存的缓存提供程序。缓存提供程序必须实现ICachingProvider
接口。Entities_SqlCacheDependenciesEnabled
- 这指定是否应该对所有业务对象的表使用 SQL 缓存依赖项。Entities_SqlCacheDependenciesDatabaseName
- 这指定应用于 SQL 缓存依赖项的数据库的名称。此设置与 app.config 中的sqlCacheDependency
元素相关。
执行缓存的查询
如果已将应用程序设置 Entities_EntityCachingEnabledDefault
设置为 true
,您将能够执行如下缓存查询
Users users = new Users();
using (UserManager userManager = new UserManager())
{
users = userManager.GetAll();
}
如果已将应用程序设置 Entities_EntityCachingEnabledDefault
设置为 false
,您可以通过以下方式在您的业务对象上启用缓存
- 将缓存已启用参数传递给业务对象
Users users = new Users(); using (UserManager userManager = new UserManager(true)) { users = userManager.GetAll(); }
- 通过设置业务对象上的
CachingEnabled
属性Users users = new Users(); using (UserManager userManager = new UserManager() { CachingEnabled = true }) { users = userManager.GetAll(); }
- 通过修改生成的业务对象部分类中的
Initialise
方法来启用缓存。/// <summary> /// Business class for table 'User'. /// </summary> public sealed partial class UserManager { private bool _initialised; protected void Initialise() { if (_initialised) return; _initialised = true; CachingEnabled = true; } }
缓存持续时间也可以通过以下两种方式修改
- 通过设置业务对象上的
CacheDurationInMinutes
属性Users users = new Users(); using (UserManager userManager = new UserManager() { CacheDurationInMinutes = 60 }) { users = userManager.GetAll(); }
- 通过修改生成的业务对象的部分类中的
Initialise
方法来更改缓存持续时间/// <summary> /// Business class for table 'User'. /// </summary> public sealed partial class UserManager { private bool _initialised; protected void Initialise() { if (_initialised) return; _initialised = true; CacheDurationInMinutes = 60; } }
使用 SQL 缓存依赖项执行缓存查询
缓存查询也可以配置为使用 SQL 缓存依赖项,这在负载平衡/Web 场环境中可能很有用。
FrameworkGen 将生成一个批处理文件 'SetupSqlCacheDependencies.bat' 以启用 SQL 缓存依赖项。这将针对数据库中的所有选定表创建依赖项。您需要修改此文件,以便仅设置您需要应用 SQL 缓存依赖项的表。批处理文件的内容如下所示
@ECHO OFF
set SERVER=TestServer
set DATABASE=TestDatabase
set USERNAME=TestUser
set PASSWORD=TestPassword!
rem Enabling cache dependencies for database 'TestDatabase'.
"%WINDIR%\Microsoft.NET\Framework\v3.5\aspnet_regsql.exe"
-ed -S %SERVER% -d %DATABASE% -U %USERNAME% -P %PASSWORD%
rem Enabling cache dependencies for table 'Answer'.
"%WINDIR%\Microsoft.NET\Framework\v3.5\aspnet_regsql.exe"
-et -S %SERVER% -d %DATABASE% -U %USERNAME% -P %PASSWORD% -t Answer
如果已将应用程序设置 Entities_SqlCacheDependenciesEnabled
设置为 true
,您将能够执行如下缓存查询
Users users = new Users();
using (UserManager userManager = new UserManager())
{
users = userManager.GetAll();
}
如果已将应用程序设置 Entities_SqlCacheDependenciesEnabled
设置为 false
,您可以通过以下方式在您的业务对象上启用 SQL 缓存依赖项缓存
- 通过设置业务对象上的
SqlCacheDependenciesEnabled
属性Users users = new Users(); using (UserManager userManager = new UserManager() { SqlCacheDependenciesEnabled = true }) { users = userManager.GetAll(); }
- 通过修改生成的业务对象部分类中的
Initialise
方法来启用缓存/// <summary> /// Business class for table 'User'. /// </summary> public sealed partial class UserManager { private bool _initialised; protected void Initialise() { if (_initialised) return; _initialised = true; SqlCacheDependenciesEnabled = true; } }
历史
- 2010 年 7 月 20 日:初始版本
- 2010 年 7 月 21 日:添加了有关设置缓存持续时间的额外信息