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

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

# 教程預覽 [01 | 前言](https://www.cnblogs.com/HDONG/p/13517146.html) [02 | 簡單的分庫分表設計](https://www.cnblogs.com/HDONG/p/13517207.html) [03 | 控制反轉搭配簡單業務](https://www.cnblogs.com/HDONG/p/13527308.html) #說明 我們上一節已經成功通過 連線提供程式儲存庫,獲取到了 連線提供程式,但是連線提供程式和資料庫連線依賴太深,這一節我們把它解決掉。 #如何控制反轉 ###1.在 EasyLogger.SqlSugarDbStorage 類庫新建 ISqlSugarSetting 和 SqlSugarSetting (SqlSugar設定) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/3181417.png) ``` public interface ISqlSugarSetting { /// /// 配置名稱Kety /// string Name { get; set; } /// /// 資料庫連線字串 /// string ConnectionString { get; set; } /// /// 資料庫型別呢 /// DbType DatabaseType { get; set; } /// /// 使用Sql執行日誌 /// Action LogExecuting { get; set; } } public class SqlSugarSetting : ISqlSugarSetting { public string Name { get; set; } public string ConnectionString { get; set; } public DbType DatabaseType { get; set; } public Action LogExecuting { get; set; } } ``` ###2.然後修改我們的 SqlSugarProvider類 在建構函式傳遞配置進來。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/181727.png) ``` 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.改造我們的依賴注入部分。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/3182330.png) ``` services.AddSingleton(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(); var sugarClient = sqlStorage.GetByName(null, SqlSugarDbStorageConsts.DefaultProviderName).Sugar; Console.WriteLine("檢視sugarClient"); }); ``` ###4.連線多個數據庫。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/183934.png) #尾聲 就這?控制反轉就實現完了,現在我們 SqlSugar連線提供程式 的資料庫連線串交給上層來提供 #加一點業務試試 ###1.在EasyLogger.Api新建Model資料夾 然後新建實體類 ``` public class EasyLoggerProject { [SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } /// /// 專案名稱 ///
public string Name { get; set; } /// /// 系統編碼 /// public string Code { get; set; } } ``` ###2.在AppSetting.json裡面加入 ``` "EasyLogger": { "DbName": "EasyLogger", // 資料庫名稱 }, ``` ###補:PathExtenstions.GetApplicationCurrentPath()方法程式碼/這裡是為了讓系統中使用的路徑統一,方便那天要改一頓Ctrl+C ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/3182330.png) ``` return AppDomain.CurrentDomain.BaseDirectory + "../"; ``` ###3.修改StartUp中我們的連結字串 我使用的是SqlLite ``` 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}"); } })); ``` ###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(); db.Dispose(); } ``` ###5.新建控制器ProjectController,然後通過函式注入拿到SqlSugar直接呼叫新增/查詢。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/90056.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/Start1.png) #思考 來回這麼久第一次執行程式碼是不是很激動,先不要著急我們來看看這個程式碼,看上去好像沒問題,我們使用介面建構函式注入了實現,還可以正常訪問資料庫,我如果要切換資料庫我就在GetByName裡換個名字就可以了。 但是不要忘了我們的口號:易擴充套件、切換快、可共存。 這切換個ORM,業務程式碼全部梭哈! #結尾 問題大家已經看到了,怎麼改造呢?大家在先把現在寫的程式碼消化一下,接下來我們就要開始改造我們的程式碼了!