01 | 模塊化方案一html
02 | 模塊化方案二git
01 | 前言github
04 | 強化設計方案json
06 | 最終篇-經過AOP自動鏈接數據庫-完成日誌業務app
咱們上一節已經成功經過 鏈接提供程序存儲庫,獲取到了 鏈接提供程序,可是鏈接提供程序和數據庫鏈接依賴太深,這一節咱們把它解決掉。async
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; } }
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; }
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"); });
就這?控制反轉就實現完了,如今咱們 SqlSugar鏈接提供程序 的數據庫鏈接串交給上層來提供ide
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; } }
"EasyLogger": { "DbName": "EasyLogger", // 數據庫名稱 },
return AppDomain.CurrentDomain.BaseDirectory + "../";
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}"); } }));
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(); }
來回這麼久第一次運行代碼是否是很激動,先不要着急咱們來看看這個代碼,看上去好像沒問題,咱們使用接口構造函數注入了實現,還能夠正常訪問數據庫,我若是要切換數據庫我就在GetByName裏換個名字就能夠了。
可是不要忘了咱們的口號:易擴展、切換快、可共存。
這切換個ORM,業務代碼所有梭哈!
問題你們已經看到了,怎麼改造呢?你們在先把如今寫的代碼消化一下,接下來咱們就要開始改造咱們的代碼了!