企業項目實戰 .Net Core + Vue/Angular 分庫分表日誌系統四 | 強化設計方案
- 2020 年 8 月 21 日
- 筆記
教程預覽
01 | 前言
02 | 簡單的分庫分表設計
03 | 控制反轉搭配簡單業務
04 | 強化設計方案
強化
先來記錄一下我們現在的樣子,一會好做個對比
1.在EasyLogger.DbStorage類庫新建 IDbEntity(主鍵約束)、IDbRepository接口(倉儲)
public interface IDbEntity<TPrimaryKey>
{
TPrimaryKey Id { get; set; }
}
public interface IDbRepository<TEntity, TPrimaryKey> : IDisposable
{
/// <summary>
/// 修改Provider
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
IDisposable ChangeProvider(string name);
/// <summary>
/// 插入數據
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
int Insert(TEntity entity);
/// <summary>
/// 查詢數據
/// </summary>
/// <returns></returns>
List<TEntity> GetQuery(Expression<Func<TEntity, bool>> expression = null);
}
2.在 EasyLogger.SqlSugarDbStorage 新建 ISqlSugarRepository 接口 繼承自IDbRepository
public interface ISqlSugarRepository<TEntity, TPrimaryKey> : IDbRepository<TEntity, TPrimaryKey>
where TEntity : class, IDbEntity<TPrimaryKey>
{
/// <summary>
/// 獲取sqlSugar對象
/// </summary>
/// <returns></returns>
SqlSugarClient GetCurrentSqlSugar();
}
3.新建 SqlSugarRepository 實現接口
public class SqlSugarRepository<TEntity, TPrimaryKey> : ISqlSugarRepository<TEntity, TPrimaryKey>
where TEntity : class, IDbEntity<TPrimaryKey> , new()
{
public string ProviderName { get; private set; }
public string OldProviderName { get; private set; }
protected readonly ISqlSugarProviderStorage _sqlSugarProviderStorage;
public SqlSugarRepository(ISqlSugarProviderStorage sqlSugarProviderStorage)
{
_sqlSugarProviderStorage = sqlSugarProviderStorage;
}
public IDisposable ChangeProvider(string name)
{
OldProviderName = ProviderName;
ProviderName = name;
return new DisposeAction(() =>
{
ProviderName = OldProviderName;
OldProviderName = null;
});
}
public SqlSugarClient GetCurrentSqlSugar()
{
return this._sqlSugarProviderStorage.GetByName(this.ProviderName, SqlSugarDbStorageConsts.DefaultProviderName).Sugar;
}
public int Insert(TEntity entity)
{
return this.GetCurrentSqlSugar().Insertable<TEntity>(entity).ExecuteCommand();
}
public List<TEntity> GetQuery(Expression<Func<TEntity, bool>> expression = null)
{
return this.GetCurrentSqlSugar().Queryable<TEntity>().Where(expression).ToList();
}
public void Dispose()
{
}
}
4.改造依賴注入部分
#region SqlSugar
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}");
}
}));
services.AddTransient(typeof(ISqlSugarRepository<,>), typeof(SqlSugarRepository<,>));
services.AddTransient(typeof(IDbRepository<,>), typeof(SqlSugarRepository<,>));
services.AddSingleton<ISqlSugarProviderStorage, DefaultSqlSugarProviderStorage>();
#endregion
5.改造接口部分
理論部分
到此改造完成 來看下我們做了什麼
1.新建公共倉儲來制定約束
2.在SqlSugar中 繼承公共倉儲接口 並 添加自己方法
3.從實現 SqlSugar自己的倉儲業務部分
4.將業務部分從獲取SugarClient 換成 操作倉儲層
分析
現在我們如果切換到FreeSql是不是只需要更換依賴注入的部分就可以了!
並且如果我們同時使用雙方我只只需要將ISqlSugarRepository作為我們的函數注入 就可以獲取到SugarClient實例來進行操作。
問題
其實我們是可以不用注入 ISqlSugarRepository 但是因為2款ORM 都不支持 IQueryable的形式來操作,所以靈活性就變得很低,希望作者後面改進吧。