教程預覽
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,業務程式碼全部梭哈!
結尾
問題大家已經看到了,怎麼改造呢?大家在先把現在寫的程式碼消化一下,接下來我們就要開始改造我們的程式碼了!