1. 程式人生 > >企業專案實戰 .Net Core + Vue/Angular 分庫分表日誌系統五 | 完善業務自動建立資料庫

企業專案實戰 .Net Core + Vue/Angular 分庫分表日誌系統五 | 完善業務自動建立資料庫

# 教程預覽 [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) [04 | 強化設計方案](https://www.cnblogs.com/HDONG/p/13539186.html) [05 | 完善業務自動建立資料庫](https://www.cnblogs.com/HDONG/p/13552014.html) #說明 這節來把基礎的業務部分完善一下。 因為 IQueryable的問題我們還是先把 IDbRepository 換成 ISqlSugarRepository來使用 private readonly ISqlSugarRepository _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 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818124003.png) ``` public class PagedInput { public Int32 PageSize { get; set; } public Int32 PageIndex { get; set; } } ``` ``` public class PagedResultDto { public List List { get; set; } public long Total { get; set; } } ``` ``` public class EasyLoggerProjectListDto { /// /// 主鍵 ///
public int Id { get; set; } /// /// 名稱 /// public string Name { get; set; } /// /// 系統編碼 /// public string Code { get; set; } } ``` ``` public class EasyLoggerProjectInput: PagedInput { /// /// 專案名稱 /// public string Name { get; set; } /// /// 系統編碼 ///
public string Code { get; set; } } ``` ``` public class EasyLoggerProjectEditDto { /// /// 主鍵 /// public int? Id { get; set; } /// /// 名稱 /// public string Name { get; set; } /// /// 系統編碼 /// public string Code { get; set; } } ``` ``` public class CreateOrUpdateEasyLoggerProjectInput { public EasyLoggerProjectEditDto EasyLoggerProject { get; set; } } ``` ###2.在專案目錄下新建資料夾 AutoMapper 存放我們的配置檔案 新建類 EntityToViewModelMappingProfile、ViewModelToEntityMappingProfile 統一繼承 Profile 來做Dto的配置 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818123842.png) ``` public class EntityToViewModelMappingProfile : Profile { public EntityToViewModelMappingProfile() { CreateMap(); CreateMap(); } } ``` ``` public class ViewModelToEntityMappingProfile : Profile { public ViewModelToEntityMappingProfile() { CreateMap(); CreateMap(); } } ``` ###3.Startup 中記得新增AutoMapper ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818123726.png) ``` #region AutoMapper services.AddAutoMapper(typeof(EntityToViewModelMappingProfile), typeof(ViewModelToEntityMappingProfile)); #endregion ``` ###4.為了方便除錯把Swagger也加上去吧(記得操作完重新生成下專案) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818124823.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818124700.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818124733.png) ###5.除錯試驗一下 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818125221.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818125243.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818125258.png) ###6.完工 到此整個教程中最枯燥的部分我們終於把他完成了。 #繼續改造我們的專案 ##不同的ORM 都有自己的生成資料庫和表的API 我們把這一部分 處理一下 ###1,將我們的SqlSugar的依賴注入封裝起來 在 EasyLogger.SqlSugarDbStorage 類庫下新建SqlSugarDbStorageServiceCollectionExtensions 類 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818222424.png) ``` public static class SqlSugarDbStorageServiceCollectionExtensions { public static IServiceCollection AddSqlSugarDbStorage(this IServiceCollection services, ISqlSugarSetting defaultDbSetting) { if (defaultDbSetting == null) { throw new ArgumentNullException(nameof(defaultDbSetting)); } services.AddSingleton(new SqlSugarProvider(defaultDbSetting)); services.AddTransient(typeof(ISqlSugarRepository<,>), typeof(SqlSugarRepository<,>)); services.AddTransient(typeof(IDbRepository<,>), typeof(SqlSugarRepository<,>)); services.AddSingleton(); return services; } } ``` ###2.然後改一下 Startup ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818222022.png) ``` #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 把我們的資料庫實體遷移進去 順便把我們的日誌實體建立一下 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818222904.png) ``` public class EasyLoggerRecord : IDbEntity { public int Id { get; set; } /// /// 專案Id ///
public int ProjectId { get; set; } /// /// 型別.自定義標籤 /// public string LogType { get; set; } /// /// 狀態-成功、失敗、警告等 /// public string LogState { get; set; } /// /// 標題 /// public string LogTitle { get; set; } /// /// 內容描述 /// public string LogContent { get; set; } /// /// 在系統中產生的時間 /// public DateTime LogTime { get; set; } /// /// 建立時間 /// public DateTime CreateTime { get; set; } } ``` ###補: 注意調整一下引用 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818223538.png) ###4.在 EasyLogger.DbStorage 類庫 新建 IPartitionDbTableFactory 介面 來約束ORM生成資料庫 ``` public interface IPartitionDbTableFactory { void DbTableCreate(string path, bool isBaseDb); } ``` ###5.老規矩 在 EasyLogger.SqlSugarDbStorage 建立類 SqlSugarPartitionDbTableFactory 實現介面 這部分程式碼的工作:通過外部傳遞進來資料庫的連線,傳遞建立基礎資料庫 還是 日誌資料庫,如果是日誌資料庫,就在生成資料庫的同時,根據當月天數,建立對應的表結構。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818224328.png) ``` 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(); } 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 建立資料庫部分 改造成下面這樣。 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818225015.png) ``` #region 預設建立基礎資料庫 和 時間資料庫 if (!File.Exists(defaultDbPath)) { var partition = services.BuildServiceProvider().GetService(); 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(); partition.DbTableCreate(startUpDbPath, false); } #endregion ``` ###7.最後記得不要忘了 在我們封裝的SqlSugar的注入類 中 新增我們的注入 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818225128.png) ###8.效果 ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818225411.png) ![](https://git.imweb.io/hdong/ImageBed/raw/master/EasyLoggerImages/20200818225543.png) #結尾回顧 ###這節文章前半部分非常的枯燥非常單純的業務部分。 ###重點主要在後半部分 ###1.我們首先建立將ORM自己的注入部分封裝起來。 ###2.更改實體存放位置,讓其公共出來,目的是可以被其他類庫訪問 ###3.我們建立生成資料庫的介面。 ###4.SqlSugar 使用自己的建立資料庫和生成表的方式 實現該介面。 #思考 現在來看我們的程式碼是不是很靈活,新的ORM進來只需要根據我們的約束實現自己的部分 我們切換ORM只要將 Startup 中 SqlSugar 這行程式碼換掉 就切換完成了。 下一節我們來做動態建立資料庫連線,切換資料庫查詢資料,以及跨表查詢資料。