企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案
教程预览
01 | 前言
02 | 简单的分库分表设计
03 | 控制反转搭配简单业务
04 | 强化设计方案
强化
先来记录一下我们现在的样子,一会好做个对比

1.在EasyLogger.DbStorage类库新建 IDbEntity(主键约束)、IDbRepository接口(仓储)

public interface IDbEntity<TPrimaryKey>
{
TPrimaryKey Id { get; set; }
}
public interface IDbRepository<TEntity, TPrimaryKey> : IDisposable
{
/// <summary>
/// 修改Provider
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
IDisposable ChangeProvider(string name);
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
int Insert(TEntity entity);
/// <summary>
/// 查询数据
/// </summary>
/// <returns></returns>
List<TEntity> GetQuery(Expression<Func<TEntity, bool>> expression = null);
}
2.在 EasyLogger.SqlSugarDbStorage 新建 ISqlSugarRepository 接口 继承自IDbRepository

public interface ISqlSugarRepository<TEntity, TPrimaryKey> : IDbRepository<TEntity, TPrimaryKey>
where TEntity : class, IDbEntity<TPrimaryKey>
{
/// <summary>
/// 获取sqlSugar对象
/// </summary>
/// <returns></returns>
SqlSugarClient GetCurrentSqlSugar();
}
3.新建 SqlSugarRepository 实现接口

public class SqlSugarRepository<TEntity, TPrimaryKey> : ISqlSugarRepository<TEntity, TPrimaryKey>
where TEntity : class, IDbEntity<TPrimaryKey> , new()
{
public string ProviderName { get; private set; }
public string OldProviderName { get; private set; }
protected readonly ISqlSugarProviderStorage _sqlSugarProviderStorage;
public SqlSugarRepository(ISqlSugarProviderStorage sqlSugarProviderStorage)
{
_sqlSugarProviderStorage = sqlSugarProviderStorage;
}
public IDisposable ChangeProvider(string name)
{
OldProviderName = ProviderName;
ProviderName = name;
return new DisposeAction(() =>
{
ProviderName = OldProviderName;
OldProviderName = null;
});
}
public SqlSugarClient GetCurrentSqlSugar()
{
return this._sqlSugarProviderStorage.GetByName(this.ProviderName, SqlSugarDbStorageConsts.DefaultProviderName).Sugar;
}
public int Insert(TEntity entity)
{
return this.GetCurrentSqlSugar().Insertable<TEntity>(entity).ExecuteCommand();
}
public List<TEntity> GetQuery(Expression<Func<TEntity, bool>> expression = null)
{
return this.GetCurrentSqlSugar().Queryable<TEntity>().Where(expression).ToList();
}
public void Dispose()
{
}
}
4.改造依赖注入部分

#region SqlSugar
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}");
}
}));
services.AddTransient(typeof(ISqlSugarRepository<,>), typeof(SqlSugarRepository<,>));
services.AddTransient(typeof(IDbRepository<,>), typeof(SqlSugarRepository<,>));
services.AddSingleton<ISqlSugarProviderStorage, DefaultSqlSugarProviderStorage>();
#endregion
5.改造接口部分

理论部分
到此改造完成 来看下我们做了什么
1.新建公共仓储来制定约束
2.在SqlSugar中 继承公共仓储接口 并 添加自己方法
3.从实现 SqlSugar自己的仓储业务部分
4.将业务部分从获取SugarClient 换成 操作仓储层
分析
现在我们如果切换到FreeSql是不是只需要更换依赖注入的部分就可以了!
并且如果我们同时使用双方我只只需要将ISqlSugarRepository作为我们的函数注入 就可以获取到SugarClient实例来进行操作。
问题
其实我们是可以不用注入 ISqlSugarRepository 但是因为2款ORM 都不支持 IQueryable的形式来操作,所以灵活性就变得很低,希望作者后面改进吧。
企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案的更多相关文章
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言
介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...
- #企业项目实战 .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 | 控制反转搭配简单业务 说明 我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深, ...
- 企业项目实战 .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 分库分表日志系统 | 简单的分库分表设计
前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...
- 数据库分库分表(sharding)系列(四) 多数据源的事务处理
系统经sharding改造之后,原来单一的数据库会演变成多个数据库,如何确保多数据源同时操作的原子性和一致性是不得不考虑的一个问题.总体上看,目前对于一个分布式系统的事务处理有三种方式:分布式事务.基 ...
随机推荐
- PHP设计模式之----简单工厂模式
定义个抽象的类(或接口),让子类去继承(实现)它 abstract class Operation { abstract public function getValue($num1, $num2); ...
- 常用mongo使用方式(限本人)
mongoose连接详情参考官网 在项目中新建db文件夹 connect.js连接mongo: const mongoose=require('mongoose'); mongoose.connect ...
- It还是高薪行业不?—软件测试
It还是高薪行业不?—软件测试 谁都希望拿高薪,但是并不是所有人.所有地方都能的:甚者培训出来还不能就业的大有人在,也不是所有人都适合培训后就业(年龄.学历.专业.期望就业地点.不同行业转行还是有很大 ...
- pandas_处理异常值缺失值重复值数据差分
# 处理异常值缺失值重复值数据差分 import pandas as pd import numpy as np import copy # 设置列对齐 pd.set_option("dis ...
- PHP simplexml_load_string() 函数
实例 转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素: <?php$note=<<<XML<note>高佣联盟 w ...
- MySQL(8.0.19版本的下载和安装)、window10
mysql的下载 MySQL官网:https://www.mysql.com/ 下载地址:https://dev.mysql.com/downloads/installer/ MySQL 8.0参 ...
- node日志管理 / pm2-logrotate-ext日志管理
本篇文章说的是,如何使用pm2管理node项目的日志输出(切割和备份),文章步骤是基于已经安装了pm2的前提下,没有的,请自行百度. 第一步:需要登录公司服务器,查看一下目前服务器保存的所有日志(用于 ...
- 从SpringBoot源码分析 配置文件的加载原理和优先级
本文从SpringBoot源码分析 配置文件的加载原理和配置文件的优先级 跟入源码之前,先提一个问题: SpringBoot 既可以加载指定目录下的配置文件获取配置项,也可以通过启动参数( ...
- mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)
前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...