1、简介
(1)、泛型缓存可能很多人不太清楚,包括我自己,只知道个大概所以然,可能能看懂代码的意思,但是却不了解其所以然,所以文本算是抛砖引玉,说说泛型缓存,欢迎指正我的错误和不足指出!
关于泛型的基础内容(什么是泛型、为什么要用泛型,泛型约束、泛型委托、泛型协变逆变)本文不做介绍,可以参考https://www.cnblogs.com/dotnet261010/p/9034594.html,写得很好.
(2)、本文将在不使用ORM的情况下,通过SqlHelper来实现CRUD(这里只实现增操作),并通过表达式树和泛型缓存提升性能!
2、实战
(1)、构建仓储基本结构和领域实体
#region 实体结构 #region 实体基本结构 /// <summary> /// 实体接口 /// </summary> /// <typeparam name="TPrimaryKey">主键类型</typeparam> public interface IEntity<TPrimaryKey> { TPrimaryKey Id { get; set; } } /// <summary> /// 默认实体接口,主键为int类型 /// </summary> public interface IEntity : IEntity<int> { } /// <summary> /// 抽象实体 /// </summary> /// <typeparam name="TPrimaryKey"></typeparam> public abstract class Entity<TPrimaryKey> : IEntity<TPrimaryKey> { public TPrimaryKey Id { get; set; } } /// <summary> /// 默认抽象实体类型(主键为int) /// </summary> public abstract class Entity : Entity<int>, IEntity { } #endregion #region 创建 - 实体结构这边单独把创建的实体部分玻璃出来,因为有些只涉及创建,不涉及修改删除 /// <summary> /// 实体创建接口 /// </summary> public interface ICreationAudited { /// <summary> /// 实体创建时间 /// </summary> DateTime CreationTime { get; set; } /// <summary> /// 创建实体的用户Id /// </summary> int? CreatorId { get; set; } } /// <summary> /// 实体修改接口 /// </summary> public interface IModificationAudited { /// <summary> /// 最后一个修改实体的用户的Id /// </summary> int? LastModifierUserId { get; set; } /// <summary> /// 最后一个修改实体的用户的时间 /// </summary> DateTime? LastModificationTime { get; set; } } /// <summary> /// 实体删除接口 /// </summary> public interface IDeletionAudited { /// <summary> /// 删除当前实体的用户Id /// </summary> int? DeleterUserId { get; set; } /// <summary> /// 删除时间 /// </summary> DateTime? DeletionTime { get; set; } /// <summary> /// 当前实体是否处于删除状态 /// </summary> bool IsDeleted { get; set; } } /// <summary> /// 抽象实体创建类,完成实体创建的工作 /// </summary> /// <typeparam name="TPrimaryKey"></typeparam> [Serializable] public abstract class CreationAuditedEntity<TPrimaryKey> : Entity<TPrimaryKey>, ICreationAudited { protected CreationAuditedEntity() { //这里可以用Provider模式进行解耦,使其支持多种时间,即国际化 CreationTime = DateTime.Now; } /// <summary> /// 支持重写,注:重写后,结构会发生变化 /// </summary> public virtual DateTime CreationTime { get; set; } /// <summary> /// 支持重写 /// </summary> public virtual int? CreatorId { get; set; } } /// <summary> /// 抽象实体创建类(以int为主键),完成实体创建的工作 /// </summary> [Serializable] public abstract class CreationAuditedEntity : CreationAuditedEntity<int>, IEntity { } #endregion #region Full - 实体结构 /// <summary> /// 实体创建、修改、删除约束接口 /// </summary> public interface IFullAudited : ICreationAudited, IModificationAudited, IDeletionAudited { } /// <summary> /// 实体创建、修改、删除抽象类 /// </summary> /// <typeparam name="TPrimaryKey"></typeparam> [Serializable] public abstract class FullAuditedEntity<TPrimaryKey> : CreationAuditedEntity<TPrimaryKey>, IFullAudited { public virtual int? LastModifierUserId { get; set; } public virtual DateTime? LastModificationTime { get; set; } public virtual int? DeleterUserId { get; set; } public virtual DateTime? DeletionTime { get; set; } public virtual bool IsDeleted { get; set; } } /// <summary> /// 默认实体创建、删除、修改抽象类(主键为int) /// </summary> [Serializable] public abstract class FullAuditedEntity : FullAuditedEntity<int>, IEntity { } #endregion #endregion #region 仓储结构 /// <summary> /// 仓储接口 /// </summary> public interface IRepository { } /// <summary> /// 仓储基类接口,实现基本的CRUD操作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <typeparam name="TPrimaryKey"></typeparam> public interface IRepositoryBase<TEntity, TPrimaryKey> : IRepository where TEntity : IEntity<TPrimaryKey> { void Insert(TEntity entity); } /// <summary> /// 抽象仓储基类,实现基本的CRUD操作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <typeparam name="TPrimaryKey"></typeparam> public abstract class RepositoryBase<TEntity, TPrimaryKey> : IRepositoryBase<TEntity, TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey> { public abstract void Insert(TEntity entity); } /// <summary> /// 具体的仓储基类,实现具体的CRUD操作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <typeparam name="TPrimaryKey"></typeparam> public class Repository<TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey> { public override void Insert(TEntity entity) { } } /// <summary> /// 默认具体的仓储基类(以int为主键),实现具体的CRUD操作 /// </summary> /// <typeparam name="TEntity"></typeparam> public class Repository<TEntity> : Repository<TEntity, int> where TEntity : class, IEntity<int> { } #endregion
整个基本结构构建完毕
(2)、构建