01 | 模块化方案一html
02 | 模块化方案二git
01 | 前言github
04 | 强化设计方案json
06 | 最终篇-经过AOP自动链接数据库-完成日志业务app
咱们上一节已经成功经过 链接提供程序存储库,获取到了 链接提供程序,可是链接提供程序和数据库链接依赖太深,这一节咱们把它解决掉。async
public interface ISqlSugarSetting { /// <summary> /// 配置名称Kety /// </summary> string Name { get; set; } /// <summary> /// 数据库链接字符串 /// </summary> string ConnectionString { get; set; } /// <summary> /// 数据库类型呢 /// </summary> DbType DatabaseType { get; set; } /// <summary> /// 使用Sql执行日志 /// </summary> Action<string, SugarParameter[]> LogExecuting { get; set; } } public class SqlSugarSetting : ISqlSugarSetting { public string Name { get; set; } public string ConnectionString { get; set; } public DbType DatabaseType { get; set; } public Action<string, SugarParameter[]> LogExecuting { get; set; } }
public SqlSugarProvider(ISqlSugarSetting SugarSetting) { this.Sugar = this.CreateSqlSugar(SugarSetting); this.ProviderName = SugarSetting.Name; } private SqlSugarClient CreateSqlSugar(ISqlSugarSetting SugarSetting) { var db = new SqlSugarClient( new ConnectionConfig() { ConnectionString = SugarSetting.ConnectionString, DbType = SugarSetting.DatabaseType,//设置数据库类型 IsAutoCloseConnection = true,//自动释放数据务,若是存在事务,在事务结束后释放 InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息 }); //用来打印Sql方便你调式 db.Aop.OnLogExecuting = SugarSetting.LogExecuting; return db; }
services.AddSingleton<ISqlSugarProvider>(new SqlSugarProvider(new SqlSugarSetting() { Name = SqlSugarDbStorageConsts.DefaultProviderName, ConnectionString = @$"Data Source=", DatabaseType = DbType.Sqlite, LogExecuting = (sql, pars) => { Console.WriteLine($"sql:{sql}"); } })); app.Use(async (context, next) => { var sqlStorage = app.ApplicationServices.GetService<ISqlSugarProviderStorage>(); var sugarClient = sqlStorage.GetByName(null, SqlSugarDbStorageConsts.DefaultProviderName).Sugar; Console.WriteLine("查看sugarClient"); });
就这?控制反转就实现完了,如今咱们 SqlSugar链接提供程序 的数据库链接串交给上层来提供ide
public class EasyLoggerProject { [SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } /// <summary> /// 项目名称 /// </summary> public string Name { get; set; } /// <summary> /// 系统编码 /// </summary> public string Code { get; set; } }
"EasyLogger": { "DbName": "EasyLogger", // 数据库名称 },
return AppDomain.CurrentDomain.BaseDirectory + "../";
var defaultDbPath = Path.Combine(PathExtenstions.GetApplicationCurrentPath(), $"{Configuration["EasyLogger:DbName"]}.db"); services.AddSingleton<ISqlSugarProvider>(new SqlSugarProvider(new SqlSugarSetting() { Name = SqlSugarDbStorageConsts.DefaultProviderName, ConnectionString = @$"Data Source={defaultDbPath}", DatabaseType = DbType.Sqlite, LogExecuting = (sql, pars) => { Console.WriteLine($"sql:{sql}"); } }));
if (!File.Exists(defaultDbPath)) { var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = @$"Data Source={defaultDbPath}", DbType = DbType.Sqlite, IsAutoCloseConnection = true, // 自动释放数据务,若是存在事务,在事务结束后释放 InitKeyType = InitKeyType.Attribute// 从实体特性中读取主键自增列信息 }); db.CodeFirst.BackupTable().InitTables<EasyLoggerProject>(); db.Dispose(); }
来回这么久第一次运行代码是否是很激动,先不要着急咱们来看看这个代码,看上去好像没问题,咱们使用接口构造函数注入了实现,还能够正常访问数据库,我若是要切换数据库我就在GetByName里换个名字就能够了。
可是不要忘了咱们的口号:易扩展、切换快、可共存。
这切换个ORM,业务代码所有梭哈!
问题你们已经看到了,怎么改造呢?你们在先把如今写的代码消化一下,接下来咱们就要开始改造咱们的代码了!