C# 谈谈泛型缓存

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)、构建

猜你喜欢

转载自www.cnblogs.com/GreenLeaves/p/10627843.html