企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务

教程

01 | 模块化方案一html

02 | 模块化方案二git

其余教程预览

分库分表项目实战教程

Git地址: https://github.com/MrChuJiu/EasyLogger

01 | 前言github

02 | 简单的分库分表设计sql

03 | 控制反转搭配简单业务数据库

04 | 强化设计方案json

05 | 完善业务自动建立数据库api

06 | 最终篇-经过AOP自动链接数据库-完成日志业务app

说明

咱们上一节已经成功经过 链接提供程序存储库,获取到了 链接提供程序,可是链接提供程序和数据库链接依赖太深,这一节咱们把它解决掉。async

如何控制反转

1.在 EasyLogger.SqlSugarDbStorage 类库新建 ISqlSugarSetting 和 SqlSugarSetting (SqlSugar设置)

public interface ISqlSugarSetting
    {
        /// <summary>
        /// 配置名称Kety
        /// </summary>
        string Name { get; set; }
        /// <summary>
        /// 数据库链接字符串
        /// </summary>
        string ConnectionString { get; set; }
        /// <summary>
        /// 数据库类型呢
        /// </summary>
        DbType DatabaseType { get; set; }
        /// <summary>
        /// 使用Sql执行日志
        /// </summary>
        Action<string, SugarParameter[]> LogExecuting { get; set; }
    }
    public class SqlSugarSetting : ISqlSugarSetting
    {
        public string Name { get; set; }
        public string ConnectionString { get; set; }
        public DbType DatabaseType { get; set; }
        public Action<string, SugarParameter[]> LogExecuting { get; set; }
    }

2.而后修改咱们的 SqlSugarProvider类 在构造函数传递配置进来。

public SqlSugarProvider(ISqlSugarSetting SugarSetting)
        {
            this.Sugar = this.CreateSqlSugar(SugarSetting);
            this.ProviderName = SugarSetting.Name;
        }

        private SqlSugarClient CreateSqlSugar(ISqlSugarSetting SugarSetting)
        {
       
            var db = new SqlSugarClient(
             new ConnectionConfig()
             {
                 ConnectionString = SugarSetting.ConnectionString,
                 DbType = SugarSetting.DatabaseType,//设置数据库类型
                 IsAutoCloseConnection = true,//自动释放数据务,若是存在事务,在事务结束后释放
                 InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息
             });

            //用来打印Sql方便你调式    
            db.Aop.OnLogExecuting = SugarSetting.LogExecuting;
            return db;
        }

3.改造咱们的依赖注入部分。

services.AddSingleton<ISqlSugarProvider>(new SqlSugarProvider(new SqlSugarSetting() {

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

            }));

app.Use(async (context, next) =>
    {
          var sqlStorage = app.ApplicationServices.GetService<ISqlSugarProviderStorage>();
          var sugarClient = sqlStorage.GetByName(null, SqlSugarDbStorageConsts.DefaultProviderName).Sugar;
          Console.WriteLine("查看sugarClient");
    });

4.链接多个数据库。

尾声

就这?控制反转就实现完了,如今咱们 SqlSugar链接提供程序 的数据库链接串交给上层来提供ide

加一点业务试试

1.在EasyLogger.Api新建Model文件夹 而后新建实体类

public class EasyLoggerProject
    {
        [SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)] 
        public int Id { get; set; }
        /// <summary>
        /// 项目名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 系统编码
        /// </summary>
        public string Code { get; set; }

    }

2.在AppSetting.json里面加入

"EasyLogger": {
    "DbName": "EasyLogger", // 数据库名称
  },

补:PathExtenstions.GetApplicationCurrentPath()方法代码/这里是为了让系统中使用的路径统一,方便那天要改一顿Ctrl+C

return AppDomain.CurrentDomain.BaseDirectory + "../";

3.修改StartUp中咱们的连接字符串 我使用的是SqlLite

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

            services.AddSingleton<ISqlSugarProvider>(new SqlSugarProvider(new SqlSugarSetting()
            {

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

            }));

4.判断目录下是否存在Db文件、若是不存在就建立数据库/建立表

if (!File.Exists(defaultDbPath))
            {
                var db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = @$"Data Source={defaultDbPath}",
                    DbType = DbType.Sqlite,
                    IsAutoCloseConnection = true, // 自动释放数据务,若是存在事务,在事务结束后释放
                    InitKeyType = InitKeyType.Attribute// 从实体特性中读取主键自增列信息
                });

                db.CodeFirst.BackupTable().InitTables<EasyLoggerProject>();

                db.Dispose();
            }

5.新建控制器ProjectController,而后经过函数注入拿到SqlSugar直接调用添加/查询。


思考

来回这么久第一次运行代码是否是很激动,先不要着急咱们来看看这个代码,看上去好像没问题,咱们使用接口构造函数注入了实现,还能够正常访问数据库,我若是要切换数据库我就在GetByName里换个名字就能够了。
可是不要忘了咱们的口号:易扩展、切换快、可共存。
这切换个ORM,业务代码所有梭哈!

结尾

问题你们已经看到了,怎么改造呢?你们在先把如今写的代码消化一下,接下来咱们就要开始改造咱们的代码了!