企業項目實戰 .Net Core + Vue/Angular 分庫分表日誌系統五 | 完善業務自動建立數據庫

教程

01 | 模塊化方案一html

02 | 模塊化方案二git

其餘教程預覽

分庫分表項目實戰教程

Git地址: https://github.com/MrChuJiu/EasyLogger

01 | 前言github

02 | 簡單的分庫分表設計sql

03 | 控制反轉搭配簡單業務數據庫

04 | 強化設計方案api

05 | 完善業務自動建立數據庫app

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

業務代碼部分沒什麼重點講解的這裏你們對着寫一下就行

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 這行代碼換掉 就切換完成了。 下一節咱們來作動態建立數據庫鏈接,切換數據庫查詢數據,以及跨表查詢數據。

相關文章
相關標籤/搜索