企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务
教程预览
01 | 前言
02 | 简单的分库分表设计
03 | 控制反转搭配简单业务
说明
我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深,这一节我们把它解决掉。
如何控制反转
1.在 EasyLogger.SqlSugarDbStorage 类库新建 ISqlSugarSetting 和 SqlSugarSetting (SqlSugar设置)
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; }
}
2.然后修改我们的 SqlSugarProvider类 在构造函数传递配置进来。
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;
}
3.改造我们的依赖注入部分。
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");
});
4.连接多个数据库。
尾升
就这?控制反转就实现完了,现在我们 SqlSugar连接提供程序 的数据库连接串交给上层来提供
加一点业务试试
1.在EasyLogger.Api新建Model文件夹 然后新建实体类
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; }
}
2.在AppSetting.json里面加入
"EasyLogger": {
"DbName": "EasyLogger", // 数据库名称
},
补:PathExtenstions.GetApplicationCurrentPath()方法代码/这里是为了让系统中使用的路径统一,方便那天要改一顿Ctrl+C
return AppDomain.CurrentDomain.BaseDirectory + "../";
3.修改StartUp中我们的链接字符串 我使用的是SqlLite
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}");
}
}));
4.判断目录下是否存在Db文件、如果不存在就创建数据库/创建表
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();
}
5.新建控制器ProjectController,然后通过函数注入拿到SqlSugar直接调用添加/查询。
思考
来回这么久第一次运行代码是不是很激动,先不要着急我们来看看这个代码,看上去好像没问题,我们使用接口构造函数注入了实现,还可以正常访问数据库,我如果要切换数据库我就在GetByName里换个名字就可以了。
但是不要忘了我们的口号:易扩展、切换快、可共存。
这切换个ORM,业务代码全部梭哈!
结尾
问题大家已经看到了,怎么改造呢?大家在先把现在写的代码消化一下,接下来我们就要开始改造我们的代码了!
企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务的更多相关文章
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- #企业项目实战 .Net Core + Vue/Angular 分库分表日志系统六 | 最终篇-通过AOP自动连接数据库-完成日志业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 强化 先来记录一下我们现在的样子,一会好做个对比 1.在EasyLogger.DbSto ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言
介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 简单的分库分表设计
前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...
- 分库分表利器——sharding-sphere
背景 得不到的东西让你彻夜难眠,没有尝试过的技术让我跃跃欲试. 本着杀鸡焉用牛刀的准则,我们倡导够用就行,不跟风,不盲从. 所以,结果就是我们一直没有真正使用分库分表.曾经好几次,感觉没有分库分表(起 ...
随机推荐
- 利用Data vault对数据仓库建模
简介 国内关于Data Vault的信息很少,所以决定写点什么,纯粹都是自己在这个行业10多年的摸爬滚打.不过为了效率,尽量做到简短,直接上干货.对于各个细节大家有不同的理解欢迎来讨论. 数据仓库建模 ...
- linux下快速列出局域网中所有主机名(计算机名)的脚本
最近有列出局域网中所有主机名的需求(SMB协议里的),但是findsmb命令总是列不全,搜了搜网上也没什么现成的解决方案,于是自己写了个python脚本 脚本会扫描局域网arp表中所有ip,并尝试解析 ...
- (一) BIO,NIO, 阻塞,非阻塞,你懂了吗
一般来说,一个输入操作通常包括两个阶段: .等待数据准备好: .从内核向进程复制数据 是否同步的判断依据是: 是否 针对的 整个过程,即2个阶段,是否有阻塞 是否阻塞的判断依据是: 按 程序等待消息通 ...
- PHP end() 函数
实例 输出数组中的当前元素和最后一个元素的值: <?php$people = array("Peter", "Joe", "Glenn" ...
- PHP number_format() 函数
实例 格式化数字: <?php高佣联盟 www.cgewang.comecho number_format("1000000")."<br>" ...
- Calibre LVS BOX 详细用法
https://www.cnblogs.com/yeungchie/ LVS BOX的使用对于后端的团队协作起到非常便利的作用. 通过在lvs rules file添加BOX的相关语句可以达到这个目的 ...
- recv & recvfrom
#include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_ ...
- Android中的LruCache的原理和使用
Android中的LruCache的原理和使用 LruCache,虽然很多文章都把LRU翻译成"最近最少使用"缓存策略,但Android中的LruCache真的如此吗? 答案是No ...
- 转)Understanding Java Memory Management
Understanding Java Memory Management - IBM Java Native Interface (JNI) Objects and Code Java Native ...
- 一些html基础概念
不做前端好多年,之所以突然写这个,是因为最近在做一个监控平台,需要一点web前端开发,想着顺便做了,但是由于长时间没接触前端导致一些基础知识的遗忘,所以在此记录下备忘,没有啥高深的东西,完全是为了对抗 ...