NHibernate3剖析:Configuration篇之Cache lambda-configuration配置

概览

上一篇文章中我们介绍了lambda表达式配置(lambda-configuration),其中还剩下EntityCache扩展方法用于配置Domain的二级缓存。

实体缓存配置

曾经,Fabio Maulo做过一次调查,发现几乎没有人在hibernate.cfg.xml或者app.config文件中配置二级缓存,发现通常做法是在各个Domain的映射(Mapping)文件中使用<cache/>配置。我想其中的一个原因是大家还不知道有这个功能。不过在介绍EntityCache扩展方法之前,我们还是先回顾下NH2弱类型(Weak Type)的缓存配置吧。

实体缓存配置(Weak Type)

在hibernate.cfg.xml文件中在session-factory-configuration节点里通过设置class-cache和collection-cache节点配置实体缓存和集合缓存:

//Code Snippets Copyright http://lyj.cnblogs.com/
<class-cache class="NameSpace.Entity" usage="read-only|read-write|nonstrict-read-write|transactional" region="ARegion"/>
<collection-cache collection="NameSpace.Entity.CollectionProperty"
          usage="read-only|read-write|nonstrict-read-write|transactional" region="ARegion"/>

这样NHibernate通过扫描hibernate.cfg.xml文件,然后调用Configuration类中的方法来实现缓存配置,所以我们只有手动编写“字符串信息”没法使用强类型。

//Code Snippets Copyright http://lyj.cnblogs.com/
public Configuration SetCacheConcurrencyStrategy(String clazz, String concurrencyStrategy)
public void SetCacheConcurrencyStrategy(String clazz, String concurrencyStrategy, String region)
public Configuration SetCollectionCacheConcurrencyStrategy(string collectionRole, string concurrencyStrategy)

在各个Domain的Mapping文件中,我们在class或者集合(set、bag、list、map)节点配置二级缓存:

//Code Snippets Copyright http://lyj.cnblogs.com/
<cache usage="read-only|read-write|nonstrict-read-write" region="ARegion"/>

实体缓存配置(EntityCache)

EntityCache原理

所谓EntityCache配置就是通过lambda表达式来实现的,即在ConfigurationExtensions类中EntityCache扩展方法,我们看看这个扩展方法具体实现吧:

//Code Snippets Copyright http://lyj.cnblogs.com/
public static Configuration EntityCache<TEntity>(this Configuration configuration,
    Action<IEntityCacheConfigurationProperties<TEntity>> entityCacheConfiguration)
    where TEntity : class
{
    var ecc = new EntityCacheConfigurationProperties<TEntity>();
    entityCacheConfiguration(ecc);
    if (ecc.Strategy.HasValue)
    {
        configuration.SetCacheConcurrencyStrategy(typeof(TEntity).FullName,
            EntityCacheUsageParser.ToString(ecc.Strategy.Value),ecc.RegionName);
    }
    foreach (var collection in ecc.Collections)
    {
        configuration.SetCollectionCacheConcurrencyStrategy(collection.Key,
            EntityCacheUsageParser.ToString(collection.Value.Strategy),collection.Value.RegionName);
    }
    return configuration;
}

我们一看便知,就是调用Configuration类中的SetCacheConcurrencyStrategy和SetCollectionCacheConcurrencyStrategy方法实现的。

EntityCache使用

我们为Domain配置二级缓存,首先定义一个Domain实体,这个实体中也包含了一个集合:

//Code Snippets Copyright http://lyj.cnblogs.com/
public class EntityToCache
{
    public string Name { get; set; }
    public IList<string> Elements { get; set; }
}

我们使用EntityCache扩展方法实践一下吧:

1.只配置Domain实体二级缓存:

//Code Snippets Copyright http://lyj.cnblogs.com/
configure.EntityCache<EntityToCache>(ce =>
      {
          ce.Strategy = EntityCacheUsage.NonStrictReadWrite;
          ce.RegionName = "MyRegion";
      });

2.配置Domain实体和它的集合二级缓存:

//Code Snippets Copyright http://lyj.cnblogs.com/
configure.EntityCache<EntityToCache>(ce =>
         {
             ce.Strategy = EntityCacheUsage.NonStrictReadWrite;
             ce.RegionName = "MyRegion";
             ce.Collection(e => e.Elements, cc =>
                       {
                           cc.RegionName = "MyCollectionRegion";
                           cc.Strategy = EntityCacheUsage.NonStrictReadWrite;
                       });
         });

3.只配置集合(不缓存Domain)二级缓存:

//Code Snippets Copyright http://lyj.cnblogs.com/
configure.EntityCache<EntityToCache>(ce => ce.Collection(e => e.Elements, cc =>
        {
            cc.RegionName = "MyCollectionRegion";
            cc.Strategy = EntityCacheUsage.NonStrictReadWrite;
        }));

结语

在NHibernate3.0中,我们可以通过EntityCache扩展方法来实现对实体二级缓存的强类型配置了。有了这个扩展方法大家在一个配置类中配置所有Domain的二级缓存了,方便统一管理、随时修改和卸载。但是仔细想想,如果项目架构设计不好,这会导致配置类所在程序集会引用所有Domain项目,而有的Domain项目有时需要引用配置类所在程序集,很容易会造成双向引用。为了避免这个问题,现在该想想如何设计我们的项目架构咯,关于大型项目中使用NHibernate的完美方案有机会慢慢介绍。

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-12 04:18:30

NHibernate3剖析:Configuration篇之Cache lambda-configuration配置的相关文章

NHibernate3剖析:Configuration篇之SessionFactory lambda配置

概览 在NHibernate3.0中,SessionFactory的Properties和Cache配置实现了流配置(fluent-configuration)和lambda表达式配置(lambda-configuration).NHibernate3.0新增了NHibernate.Cfg.Loquacious这个命名空间.为我们增加了强类型配置支持. 上一篇介绍了流配置(fluent-configuration),还不知道的请在此打住,看看上一篇具体实现.这篇介绍下lambda表达式配置(la

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号. 假设你还不熟悉NHibernate.能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.c

NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

ORuM思想浮出 对于ORM(Object Relational Mapping)我们太熟悉了,可是我们从还有一个角度能够想象出ORuM(Object Relational un-Mapping)的思想理念. 我们在程序中只定义Domain, 而想有个工具能够帮助我们"自己主动化"实现Mapping.我们无需按传统的ORM思想那样为Domain手动编码Mapping. ORuM对于使用者来说更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Obj