教程预览

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 分库分表日志系统 | 控制反转搭配简单业务的更多相关文章

  1. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  2. #企业项目实战 .Net Core + Vue/Angular 分库分表日志系统六 | 最终篇-通过AOP自动连接数据库-完成日志业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  3. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  4. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...

  5. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  6. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 强化 先来记录一下我们现在的样子,一会好做个对比 1.在EasyLogger.DbSto ...

  7. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言

    介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...

  8. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 简单的分库分表设计

    前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...

  9. 分库分表利器——sharding-sphere

    背景 得不到的东西让你彻夜难眠,没有尝试过的技术让我跃跃欲试. 本着杀鸡焉用牛刀的准则,我们倡导够用就行,不跟风,不盲从. 所以,结果就是我们一直没有真正使用分库分表.曾经好几次,感觉没有分库分表(起 ...

随机推荐

  1. 题解 洛谷 P2280 【[HNOI2003]激光炸弹】

    这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上. 经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值 ...

  2. Centos 7 静态IP设置

    1.编辑 ifcfg-eth0 文件,vim 最小化安装时没有被安装,需要自行安装不描述. # vim /etc/sysconfig/network-scripts/ifcfg-eth0 2.修改如下 ...

  3. Netty 学习笔记(1) ------ Hello World

    服务端启动流程 package com.example.netty; import com.example.netty.handler.HelloServerHandler; import io.ne ...

  4. 手动触发浏览器resize

    今天做echarts图表 发现饼图不能居中,resize之后才会居中. 于是想手动触发resize方法,但是不改变浏览器窗口 JQ $(window).trigger('risize'); JS    ...

  5. chrome浏览器hover时文字抖动bug

    今天发现一个奇怪的bug,chrome浏览器里面  当父标签定位为fixed时,hover里面子标签时,文本会发生抖动,百思不得其解,经过多方查证,发现解决办法 -webkit-transform:  ...

  6. # SpringBoot-环境搭建

    SpringBoot-环境搭建 标签(空格分隔): java,SpringBoot 1.创建Maven工程 2.编写pom文件 <parent> <groupId>org.sp ...

  7. methodology of english learning

    classify the vocabulary into different catigories syllabus about person

  8. etcd3.0集群安装

    etcd 是一个分布式一致性键值存储,用于共享配置和服务发现,Go编写,并使用 Raft 一致性算法来管理高可用复制日志. 特性 简单:支持curl方式的用户API(http+json)安全:可选ss ...

  9. 第十四章 JDK新特性回顾

    14.1.JDK5新特性回顾 自动装箱.拆箱 静态导入 增强for循环 可变参数 枚举 泛型 元数据 14.2.JDK7新特性回顾 对Java集合(Collections)的增强支持 在switch中 ...

  10. Python os.fdopen() 方法

    概述 os.fdopen() 方法用于通过文件描述符 fd 创建一个文件对象,并返回这个文件对象.高佣联盟 www.cgewang.com Unix, Windows上可用. 语法 fdopen()方 ...