65.9K
CodeProject 正在变化。 阅读更多。
Home

FrameworkGen - 配置实体缓存

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2010 年 7 月 20 日

CPOL

3分钟阅读

viewsIcon

15249

了解如何利用 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,您可以通过以下方式在您的业务对象上启用缓存

  1. 将缓存已启用参数传递给业务对象
    Users users = new Users();
    
    using (UserManager userManager = new UserManager(true))
    {
        users = userManager.GetAll();
    }
  2. 通过设置业务对象上的 CachingEnabled 属性
    Users users = new Users();
    
    using (UserManager userManager = new UserManager() { CachingEnabled = true })
    {
        users = userManager.GetAll();
    } 
  3. 通过修改生成的业务对象部分类中的 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;
        }
    }  

缓存持续时间也可以通过以下两种方式修改

  1. 通过设置业务对象上的 CacheDurationInMinutes 属性
    Users users = new Users();
    
    using (UserManager userManager = new UserManager() { CacheDurationInMinutes = 60 })
    {
        users = userManager.GetAll();
    } 
  2. 通过修改生成的业务对象的部分类中的 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 缓存依赖项缓存

  1. 通过设置业务对象上的 SqlCacheDependenciesEnabled 属性
    Users users = new Users();
    
    using (UserManager userManager = new UserManager() 
    	{ SqlCacheDependenciesEnabled = true })
    {
        users = userManager.GetAll();
    } 
  2. 通过修改生成的业务对象部分类中的 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 日:添加了有关设置缓存持续时间的额外信息
© . All rights reserved.