企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案

教程预览

01 | 前言
02 | 简单的分库分表设计
03 | 控制反转搭配简单业务
04 | 强化设计方案
05 | 完善业务自动创建数据库

强化

先来记录一下我们现在的样子,一会好做个对比
企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第1张图片

1.在EasyLogger.DbStorage类库新建 IDbEntity(主键约束)、IDbRepository接口(仓储)

企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第2张图片

    public interface IDbEntity
    {
        TPrimaryKey Id { get; set; }
    }
    public interface IDbRepository : IDisposable
    {
        /// 
        /// 修改Provider
        /// 
        /// 
        /// 
        IDisposable ChangeProvider(string name);


        /// 
        /// 插入数据
        /// 
        /// 
        /// 
        int Insert(TEntity entity);

        /// 
        /// 查询数据
        /// 
        /// 
        List GetQuery(Expression> expression = null);

    }

2.在 EasyLogger.SqlSugarDbStorage 新建 ISqlSugarRepository 接口 继承自IDbRepository

企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第3张图片

    public interface ISqlSugarRepository : IDbRepository
            where TEntity : class, IDbEntity
    {
        /// 
        /// 获取sqlSugar对象
        /// 
        /// 
        SqlSugarClient GetCurrentSqlSugar();
    }

3.新建 SqlSugarRepository 实现接口

企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第4张图片

public class SqlSugarRepository : ISqlSugarRepository
          where TEntity : class, IDbEntity , new()
    {
 
        public string ProviderName { get; private set; }
        public string OldProviderName { get; private set; }
        protected readonly ISqlSugarProviderStorage _sqlSugarProviderStorage;

        public SqlSugarRepository(ISqlSugarProviderStorage sqlSugarProviderStorage)
        {
            _sqlSugarProviderStorage = sqlSugarProviderStorage;
        }

        public IDisposable ChangeProvider(string name)
        {
            OldProviderName = ProviderName;
            ProviderName = name;
            return new DisposeAction(() =>
            {
                ProviderName = OldProviderName;
                OldProviderName = null;
            });
        }


        public SqlSugarClient GetCurrentSqlSugar()
        {
            return this._sqlSugarProviderStorage.GetByName(this.ProviderName, SqlSugarDbStorageConsts.DefaultProviderName).Sugar;
        }
      
        public int Insert(TEntity entity)
        {
            return this.GetCurrentSqlSugar().Insertable(entity).ExecuteCommand();
        }

        public List GetQuery(Expression> expression = null)
        {
            return this.GetCurrentSqlSugar().Queryable().Where(expression).ToList();
        }

        public void Dispose()
        {

        }


}

4.改造依赖注入部分

企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第5张图片

  #region SqlSugar
            var defaultDbPath = Path.Combine(PathExtenstions.GetApplicationCurrentPath(), $"{Configuration["EasyLogger:DbName"]}.db");

            services.AddSingleton(new SqlSugarProvider(new SqlSugarSetting()
            {

                Name = SqlSugarDbStorageConsts.DefaultProviderName,
                ConnectionString = @$"Data Source={defaultDbPath}",
                DatabaseType = DbType.Sqlite,
                LogExecuting = (sql, pars) =>
                {
                    Console.WriteLine($"sql:{sql}");
                }

            }));
   
            services.AddTransient(typeof(ISqlSugarRepository<,>), typeof(SqlSugarRepository<,>));
            services.AddTransient(typeof(IDbRepository<,>), typeof(SqlSugarRepository<,>));
            services.AddSingleton();
            #endregion

5.改造接口部分

企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案_第6张图片

理论部分

到此改造完成 来看下我们做了什么

1.新建公共仓储来制定约束

2.在SqlSugar中 继承公共仓储接口 并 添加自己方法

3.从实现 SqlSugar自己的仓储业务部分

4.将业务部分从获取SugarClient 换成 操作仓储层

分析

现在我们如果切换到FreeSql是不是只需要更换依赖注入的部分就可以了!
并且如果我们同时使用双方我只只需要将ISqlSugarRepository作为我们的函数注入 就可以获取到SugarClient实例来进行操作。

问题

其实我们是可以不用注入 ISqlSugarRepository 但是因为2款ORM 都不支持 IQueryable的形式来操作,所以灵活性就变得很低,希望作者后面改进吧。

你可能感兴趣的:(企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案)