企業項目實戰 .Net Core + Vue/Angular 分庫分表日志系統三 | 控制反轉搭配簡單業務


教程

01 | 模塊化方案一

02 | 模塊化方案二

其他教程預覽

分庫分表項目實戰教程

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

01 | 前言

02 | 簡單的分庫分表設計

03 | 控制反轉搭配簡單業務

04 | 強化設計方案

05 | 完善業務自動創建數據庫

06 | 最終篇-通過AOP自動連接數據庫-完成日志業務

說明

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

如何控制反轉

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

結尾

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM