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 这行代码换掉 就切换完成了。 下一节咱们来作动态建立数据库链接,切换数据库查询数据,以及跨表查询数据。