企業專案實戰 .Net Core + Vue/Angular 分庫分表日誌系統 | 控制反轉搭配簡單業務

初久的私房菜發表於2020-08-19

教程預覽

01 | 前言
02 | 簡單的分庫分表設計
03 | 控制反轉搭配簡單業務

說明

我們上一節已經成功通過 連線提供程式儲存庫,獲取到了 連線提供程式,但是連線提供程式和資料庫連線依賴太深,這一節我們把它解決掉。

如何控制反轉

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連線提供程式 的資料庫連線串交給上層來提供

加一點業務試試

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,業務程式碼全部梭哈!

結尾

問題大家已經看到了,怎麼改造呢?大家在先把現在寫的程式碼消化一下,接下來我們就要開始改造我們的程式碼了!

相關文章