概览
在上一篇文章中我们介绍了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项目有时须要引用配置类所在程序集,非常easy会造成双向引用。为了避免这个问题,如今该想想怎样设计我们的项目架构咯。关于大型项目中使用NHibernate的完美方案有机会慢慢介绍。
来源:https://www.cnblogs.com/jzdwajue/p/6875661.html