01 | 模塊化方案一html
02 | 模塊化方案二git
01 | 前言github
04 | 強化設計方案api
06 | 最終篇-經過AOP自動鏈接數據庫-完成日誌業務ide
這節來把基礎的業務部分完善一下。模塊化
由於 IQueryable的問題咱們仍是先把 IDbRepository 換成 ISqlSugarRepository來使用
private readonly ISqlSugarRepository<EasyLoggerProject,int> _repository;ui
AutoMapper 和 Swagger 已經有很好的講解文章,不作重複講解。
安裝基本使用的包
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
基本介紹和使用方法參考:http://www.javashuo.com/article/p-rkhbpcbn-bn.html
Swashbuckle.AspNetCore
基本介紹和使用方法參考:http://www.javashuo.com/article/p-yiveyxrl-bw.html
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; } }
public class EntityToViewModelMappingProfile : Profile { public EntityToViewModelMappingProfile() { CreateMap<EasyLoggerProject, EasyLoggerProjectListDto>(); CreateMap<EasyLoggerProject, EasyLoggerProjectEditDto>(); } }
public class ViewModelToEntityMappingProfile : Profile { public ViewModelToEntityMappingProfile() { CreateMap<EasyLoggerProjectListDto, EasyLoggerProject>(); CreateMap<EasyLoggerProjectEditDto, EasyLoggerProject>(); } }
#region AutoMapper services.AddAutoMapper(typeof(EntityToViewModelMappingProfile), typeof(ViewModelToEntityMappingProfile)); #endregion
到此整個教程中最枯燥的部分咱們終於把他完成了。
在 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; } }
#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
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; } }
public interface IPartitionDbTableFactory { void DbTableCreate(string path, bool isBaseDb); }
這部分代碼的工做:經過外部傳遞進來數據庫的鏈接,傳遞建立基礎數據庫 仍是 日誌數據庫,若是是日誌數據庫,就在生成數據庫的同時,根據當月天數,建立對應的表結構。
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)); } } }
#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
如今來看咱們的代碼是否是很靈活,新的ORM進來只須要根據咱們的約束實現本身的部分 咱們切換ORM只要將 Startup 中 SqlSugar 這行代碼換掉 就切換完成了。 下一節咱們來作動態建立數據庫鏈接,切換數據庫查詢數據,以及跨表查詢數據。