企業專案實戰 .Net Core + Vue/Angular 分庫分表日誌系統 | 控制反轉搭配簡單業務
阿新 • • 發佈:2020-08-19
# 教程預覽
[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,業務程式碼全部梭哈!
#結尾
問題大家已經看到了,怎麼改造呢?大家在先把現在寫的程式碼消化一下,接下來我們就要開始改造我們的程式碼了!