教程預覽
01 | 前言
02 | 簡單的分庫分表設計
03 | 控制反轉搭配簡單業務
04 | 強化設計方案
05 | 完善業務自動建立資料庫
說明
這節來把基礎的業務部分完善一下。
因為 IQueryable的問題我們還是先把 IDbRepository 換成 ISqlSugarRepository來使用
private readonly ISqlSugarRepository<EasyLoggerProject,int> _repository;
AutoMapper 和 Swagger 已經有很好的講解文章,不做重複講解。
安裝基本使用的包
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
基本介紹和使用方法參考:https://www.cnblogs.com/laozhang-is-phi/p/9560949.html
Swashbuckle.AspNetCore
基本介紹和使用方法參考:https://www.cnblogs.com/laozhang-is-phi/p/9495624.html
業務程式碼部分沒什麼重點講解的這裡大家對著寫一下就行
1.在專案目錄下新建資料夾 Dtos 來存放我們的Dto實體 新建資料夾 EasyLoggerProjectDto 存放專案部分的Dto
public class PagedInput
{
public Int32 PageSize { get; set; }
public Int32 PageIndex { get; set; }
}
public class PagedResultDto<T>
{
public List<T> List { get; set; }
public long Total { get; set; }
}
public class EasyLoggerProjectListDto
{
/// <summary>
/// 主鍵
/// </summary>
public int Id { get; set; }
/// <summary>
/// 名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 系統編碼
/// </summary>
public string Code { get; set; }
}
public class EasyLoggerProjectInput: PagedInput
{
/// <summary>
/// 專案名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 系統編碼
/// </summary>
public string Code { get; set; }
}
public class EasyLoggerProjectEditDto
{
/// <summary>
/// 主鍵
/// </summary>
public int? Id { get; set; }
/// <summary>
/// 名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 系統編碼
/// </summary>
public string Code { get; set; }
}
public class CreateOrUpdateEasyLoggerProjectInput
{
public EasyLoggerProjectEditDto EasyLoggerProject { get; set; }
}
2.在專案目錄下新建資料夾 AutoMapper 存放我們的配置檔案 新建類 EntityToViewModelMappingProfile、ViewModelToEntityMappingProfile 統一繼承 Profile 來做Dto的配置
public class EntityToViewModelMappingProfile : Profile
{
public EntityToViewModelMappingProfile()
{
CreateMap<EasyLoggerProject, EasyLoggerProjectListDto>();
CreateMap<EasyLoggerProject, EasyLoggerProjectEditDto>();
}
}
public class ViewModelToEntityMappingProfile : Profile
{
public ViewModelToEntityMappingProfile()
{
CreateMap<EasyLoggerProjectListDto, EasyLoggerProject>();
CreateMap<EasyLoggerProjectEditDto, EasyLoggerProject>();
}
}
3.Startup 中記得新增AutoMapper
#region AutoMapper
services.AddAutoMapper(typeof(EntityToViewModelMappingProfile), typeof(ViewModelToEntityMappingProfile));
#endregion
4.為了方便除錯把Swagger也加上去吧(記得操作完重新生成下專案)
5.除錯試驗一下
6.完工
到此整個教程中最枯燥的部分我們終於把他完成了。
繼續改造我們的專案
不同的ORM 都有自己的生成資料庫和表的API 我們把這一部分 處理一下
1,將我們的SqlSugar的依賴注入封裝起來
在 EasyLogger.SqlSugarDbStorage 類庫下新建SqlSugarDbStorageServiceCollectionExtensions 類
public static class SqlSugarDbStorageServiceCollectionExtensions
{
public static IServiceCollection AddSqlSugarDbStorage(this IServiceCollection services,
ISqlSugarSetting defaultDbSetting)
{
if (defaultDbSetting == null)
{
throw new ArgumentNullException(nameof(defaultDbSetting));
}
services.AddSingleton<ISqlSugarProvider>(new SqlSugarProvider(defaultDbSetting));
services.AddTransient(typeof(ISqlSugarRepository<,>), typeof(SqlSugarRepository<,>));
services.AddTransient(typeof(IDbRepository<,>), typeof(SqlSugarRepository<,>));
services.AddSingleton<ISqlSugarProviderStorage, DefaultSqlSugarProviderStorage>();
return services;
}
}
2.然後改一下 Startup
#region SqlSugar
// 改造一下把 自己的注入部分封裝起來
var defaultDbPath = Path.Combine(PathExtenstions.GetApplicationCurrentPath(), $"{Configuration["EasyLogger:DbName"]}.db");
services.AddSqlSugarDbStorage(new SqlSugarSetting()
{
Name = SqlSugarDbStorageConsts.DefaultProviderName,
ConnectionString = @$"Data Source={defaultDbPath}",
DatabaseType = DbType.Sqlite,
LogExecuting = (sql, pars) =>
{
Console.WriteLine($"sql:{sql}");
}
});
#endregion
3.新建 EasyLogger.Model 類庫 記得引用 EasyLogger.DbStorage 把我們的資料庫實體遷移進去 順便把我們的日誌實體建立一下
public class EasyLoggerRecord : IDbEntity<int>
{
public int Id { get; set; }
/// <summary>
/// 專案Id
/// </summary>
public int ProjectId { get; set; }
/// <summary>
/// 型別.自定義標籤
/// </summary>
public string LogType { get; set; }
/// <summary>
/// 狀態-成功、失敗、警告等
/// </summary>
public string LogState { get; set; }
/// <summary>
/// 標題
/// </summary>
public string LogTitle { get; set; }
/// <summary>
/// 內容描述
/// </summary>
public string LogContent { get; set; }
/// <summary>
/// 在系統中產生的時間
/// </summary>
public DateTime LogTime { get; set; }
/// <summary>
/// 建立時間
/// </summary>
public DateTime CreateTime { get; set; }
}
補: 注意調整一下引用
4.在 EasyLogger.DbStorage 類庫 新建 IPartitionDbTableFactory 介面 來約束ORM生成資料庫
public interface IPartitionDbTableFactory
{
void DbTableCreate(string path, bool isBaseDb);
}
5.老規矩 在 EasyLogger.SqlSugarDbStorage 建立類 SqlSugarPartitionDbTableFactory 實現介面
這部分程式碼的工作:通過外部傳遞進來資料庫的連線,傳遞建立基礎資料庫 還是 日誌資料庫,如果是日誌資料庫,就在生成資料庫的同時,根據當月天數,建立對應的表結構。
public class SqlSugarPartitionDbTableFactory : IPartitionDbTableFactory
{
public void DbTableCreate(string path, bool isBaseDb)
{
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = $@"Data Source={path}",
DbType = DbType.Sqlite,
IsAutoCloseConnection = true, // 自動釋放資料務,如果存在事務,在事務結束後釋放
InitKeyType = InitKeyType.Attribute// 從實體特性中讀取主鍵自增列資訊
});
// 生成資料庫
// db.Ado.ExecuteCommand($"create dataabse {dbName}");
if (isBaseDb)
{
db.CodeFirst.BackupTable().InitTables<EasyLoggerProject>();
}
else
{
CreateLoggerTable(db);
}
db.Dispose();
}
private static void CreateLoggerTable(SqlSugarClient db)
{
int days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
for (int i = 1; i <= days; i++)
{
// 自定義生成表的別名
db.MappingTables.Add(nameof(EasyLoggerRecord), $"{nameof(EasyLoggerRecord)}_{i}");
db.CodeFirst.InitTables(typeof(EasyLoggerRecord));
}
}
}
6.將我們 Startup 中 ConfigureServices 建立資料庫部分 改造成下面這樣。
#region 預設建立基礎資料庫 和 時間資料庫
if (!File.Exists(defaultDbPath))
{
var partition = services.BuildServiceProvider().GetService<IPartitionDbTableFactory>();
partition.DbTableCreate(defaultDbPath, true);
}
var startUpDbPath = Path.Combine(PathExtenstions.GetApplicationCurrentPath(), $"{Configuration["EasyLogger:DbName"]}-{DateTime.Now.ToString("yyyy-MM")}.db");
if (!File.Exists(startUpDbPath))
{
var partition = services.BuildServiceProvider().GetService<IPartitionDbTableFactory>();
partition.DbTableCreate(startUpDbPath, false);
}
#endregion
7.最後記得不要忘了 在我們封裝的SqlSugar的注入類 中 新增我們的注入
8.效果
結尾回顧
這節文章前半部分非常的枯燥非常單純的業務部分。
重點主要在後半部分
1.我們首先建立將ORM自己的注入部分封裝起來。
2.更改實體存放位置,讓其公共出來,目的是可以被其他類庫訪問
3.我們建立生成資料庫的介面。
4.SqlSugar 使用自己的建立資料庫和生成表的方式 實現該介面。
思考
現在來看我們的程式碼是不是很靈活,新的ORM進來只需要根據我們的約束實現自己的部分
我們切換ORM只要將 Startup 中 SqlSugar 這行程式碼換掉 就切換完成了。
下一節我們來做動態建立資料庫連線,切換資料庫查詢資料,以及跨表查詢資料。