C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践

在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受欢迎的一款。它不仅功能强大,还能结合依赖注入和仓储模式,让代码结构更加清晰。接下来,我们就深入剖析一段利用 SqlSugar 实现依赖注入与仓储模式的代码,了解其原理与使用方式。

一、核心代码解析

1. 基础实体类定义

public abstract class BaseEntity
{[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]public virtual int Id { get; set; }
}

BaseEntity作为基础实体类,定义了一个自增长的主键Id,通过SugarColumn特性设置Id为自增主键,后续的实体类都可以继承该类,统一规范实体的基本属性,为数据库表的主键设置提供便利。

2. 仓储类实现

public class Repository<T> : SimpleClient<T> where T : BaseEntity, new()
{public Repository(ISqlSugarClient db){base.Context = db;}
}

Repository<T>类继承自SimpleClient<T>,它是基于 SqlSugar 实现的泛型仓储类。通过构造函数接收ISqlSugarClient类型的数据库客户端实例db,并将其赋值给基类的Context属性,这样在该仓储类中就可以使用SqlSugar提供的各种数据库操作方法,对继承自BaseEntity的实体类T进行数据访问和操作,实现了对数据库操作的封装,符合仓储模式的理念。

3. SqlSugar 初始化配置

public static class SqlSugarInit
{private static readonly string connectionKey = "database_connection_key";public static void AddSqlSugarSetup(this IServiceCollection services){if (services is null){throw new ArgumentNullException(nameof(services));}var config = GetConfig(connectionKey);var client = new SqlSugarScope(config);services.AddSingleton<ISqlSugarClient>(o => client);var models = GetEntities();client.DbMaintenance.CreateDatabase();client.CodeFirst.SetStringDefaultLength(200).InitTables(models);}private static ConnectionConfig GetConfig(string connectionKey){var connectionString = ConfigurationManager.ConnectionStrings\[connectionKey].ConnectionString;var moreSettings = new ConnMoreSettings{IsAutoRemoveDataCache = true,DisableMillisecond = true,IsWithNoLockQuery = true,SqliteCodeFirstEnableDefaultValue = true,};var aopEvents = new AopEvents{OnLogExecuting = (sql, parameters) =>{parameters.ToList().ForEach(p => sql.Replace(p.ParameterName, p.Value.ToString()));var log = string.Join("\r\n", new string[] { "--------", "【SQL语句】:", sql });Console.WriteLine(log);},};return new ConnectionConfig{ConfigId = 1,ConnectionString = connectionString,DbType = DbType.SqlServer,IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute,MoreSettings = moreSettings,AopEvents = aopEvents,LanguageType = LanguageType.Chinese};}private static Type[] GetEntities(){return Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.Load(a)).SelectMany(a => a.GetTypes()).Where(t => t.IsSubclassOf(typeof(BaseEntity))).Where(t => t.GetCustomAttributes().Any(a => a is SugarTable)).ToArray();}
}

SqlSugarInit类负责 SqlSugar 的初始化配置和依赖注入相关操作:

  • AddSqlSugarSetup方法通过扩展IServiceCollection,将 SqlSugar 配置添加到服务集合中。它先获取数据库连接配置config,创建SqlSugarScope实例client,并将ISqlSugarClient以单例模式注册到服务集合,保证整个应用中只有一个SqlSugarClient实例。接着获取所有符合条件的实体类models,使用DbMaintenance.CreateDatabase创建数据库(如果不存在),并通过CodeFirst初始化数据库表结构。
  • GetConfig方法用于获取数据库连接配置信息,从配置文件中读取连接字符串,设置连接的额外参数moreSettings和 AOP 事件aopEvents(这里实现了 SQL 语句执行日志输出功能),最终返回完整的ConnectionConfig对象。
  • GetEntities方法通过反射,从当前程序集及其引用的程序集中,筛选出继承自BaseEntity且带有SugarTable特性的实体类类型数组,以便后续进行数据库表的初始化操作。

二、使用示例

1. 假设我们有一个User实体类:

using SqlSugar;[SugarTable("Users")]public class User : BaseEntity
{public string Name { get; set; }public int Age { get; set; }
}

2. 在应用的启动配置中,注册 SqlSugar 服务:

using Microsoft.Extensions.DependencyInjection;var services = new ServiceCollection();
services.AddSqlSugarSetup();
services.AddScoped(typeof(Repository<>));var serviceProvider = services.BuildServiceProvider();

3. 在业务逻辑中使用仓储类进行数据操作:

class UserService
{private readonly Repository<User> userRepository;public UserService(Repository<User> userRepository){this.userRepository = userRepository;}public User FindOne(int id){return this.userRepository.GetById(id);}
}

上述代码中,先创建User实体类并继承BaseEntity,使用SugarTable特性指定数据库表名。在启动配置时,注册 SqlSugar 服务和User实体类对应的仓储服务。在业务逻辑中获取User仓储实例,进行数据插入和查询操作,简洁地实现了数据库交互。

三、优势与注意事项

1. 优势

  • 代码结构清晰:依赖注入和仓储模式的结合,将数据库操作与业务逻辑分离,降低了代码的耦合度,使代码结构更加清晰,便于维护和扩展。
  • 提高开发效率:SqlSugar 提供了丰富的数据库操作方法,通过仓储类的封装,开发者无需重复编写基础的数据访问代码,提高了开发效率。
  • 统一规范BaseEntity类和统一的配置方式,为实体类和数据库操作建立了统一的规范,保证了代码的一致性和规范性。

2. 注意事项

  • 数据库连接字符串配置:确保ConfigurationManager.ConnectionStrings中配置的连接字符串正确,否则无法建立数据库连接。在不同的环境(开发、测试、生产)中,要注意切换相应的配置。
  • 实体类特性使用:使用SugarTableSugarColumn等特性时,要准确设置属性,避免因特性设置错误导致数据库表结构创建或数据映射出现问题。
  • 单例模式的影响ISqlSugarClient以单例模式注册,在多线程环境下要注意线程安全问题,虽然 SqlSugar 本身在设计上考虑了多线程场景,但在复杂的业务逻辑中,仍需谨慎处理共享资源的访问。

通过以上对 SqlSugar 结合依赖注入与仓储模式的代码分析和示例展示,相信大家对如何在 C# 项目中高效地进行数据库操作有了更深入的了解。合理运用这些技术,能够让我们的项目在数据访问层面更加稳健和灵活,为整个应用的稳定运行提供有力支持。如果你在实际使用过程中遇到问题或有更好的实践经验,欢迎在评论区交流分享。

上述博客详细讲解了代码的功能与应用。若你觉得内容还需补充,比如增加更多复杂操作示例或优化说明,可随时告知我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Razor编程中@Helper的用法大全

文章目录 第一章&#xff1a;Helper基础概念1.1 Helper的定义与作用1.2 Helper的基本语法结构1.3 Helper与HtmlHelper的区别 第二章&#xff1a;基础Helper用法2.1 无参数Helper2.2 带简单参数的Helper2.3 带默认值的参数2.4 使用模型作为参数 第三章&#xff1a;高级Helper用法…

Python-正则表达式(re 模块)

目录 一、re 模块的使用过程二、正则表达式的字符匹配1. 匹配开头结尾2. 匹配单个字符3. 匹配多个字符4. 匹配分组5. Python 代码示例 三、re 模块的函数1. 函数一览表2. Python 代码示例1&#xff09;search 与 finditer2&#xff09;findall3&#xff09;sub4&#xff09;spl…

前端知识导图

前端知识导图 参考&#xff1a;字节标准 前端知识导图 通用基础 1、编程语言 HTML CSS JS TS 2、计算机基础 计算机网略 数据结构 算法&#xff1a;二分查找、十大排序、二叉树先中后和层次遍历、集合交并集、leetcode刷题经验 编译构建 webpack & vite 应用基础 开…

moon游戏服务器-demo运行

下载地址 https://github.com/sniper00/MoonDemo redis安装 Redis-x64-3.0.504.msi 服务器配置文件 D:\gitee\moon_server_demo\serverconf.lua 貌似不修改也可以的&#xff0c;redis不要设置密码 windows编译 安装VS2022 Community 下载premake5.exe放MoonDemo\server\moon 双…

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…

ajax学习手册

Ajax 通俗易懂学习手册 目录 Ajax 基础概念XMLHttpRequest 详解Fetch API (现代方式)处理不同数据格式错误处理和状态码Ajax 高级技巧实战项目案例最佳实践 Ajax 基础概念 什么是 Ajax&#xff1f; Ajax Asynchronous JavaScript And XML 通俗解释&#xff1a; Ajax 就像…

人工智能学习02-安装环境

人工智能学习概述—快手视频 人工智能学习02-安装—快手视频 Python安装 Python安装分为两种方法&#xff0c;一是从官网(https://www.python.org/)下载Python工具(比如python-2.7.msi)进行安装&#xff0c;并设置Path环境变量&#xff1b;二是下载工具Anaconda集成环境进行安…

电脑开不了机,主板显示67码解决过程

文章目录 现象分析内存条问题BIOS设置问题其它问题 解决清理内存条金手指所需工具操作步骤注意事项 电脑在运行过程中&#xff0c;显示内存不足&#xff0c;重启电脑却无法启动。 现象 System Initialization 主板风扇是转的&#xff0c;也有灯光显示&#xff0c;插上屏幕&am…

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…

springboot的test模块使用Autowired注入失败

springboot的test模块使用Autowired注入失败的原因&#xff1a; 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法&#xff1a;再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解&#xff0c;就不用加上RunWith&…

Cursor Rules 使用

前言 最近在使用 Cursor 进行编程辅助时&#xff0c;发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码&#xff0c;总是不符合预期。 遂引出本篇&#xff0c;介绍一下 Rules &#xff0c;它就可以做一些规范约束之类的事情。 什么是 Cursor R…

项目任务,修改svip用户的存储空间。

修改存储空间 3GB->5GB&#xff0c;这是项目任务&#xff0c;首先有人任务就要去思考实现思路&#xff0c;首先存储空间&#xff0c;也就是说不只是前端样式3GB改一下就可以了&#xff0c;那用户实际还是3GB&#xff0c;所以我们去网站看后端谁返回给我们了3GB&#xff0c;我…

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…

iview中的table组件点击一行中的任意一点选中本行

<Table border ref"selection" size"small" on-row-click"onClickRow"></Table>// table组件点击一行任意位置选中onClickRow(row, index) {this.$refs.selection.toggleSelect(index)}写上toggleSelect(index)方法即可&#xff0c;…

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…

算法-构造题

#include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; const ll N 5e5 10; int main() {ll n, k;cin >> n >> k; ll a[N] {0}; // 初始化一个大小为N的数组a&#xff0c;用于存储排列// 构造满足条件的排列for (l…

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…

OC—UI学习-2

导航控制器和导航工具栏 导航控制器 UINAvigationController与UIViewController的关系 UIViewController是什么&#xff1f; 它是一个普通的视图控制器&#xff0c;负责管理一个页面 UINavigationController是什么&#xff1f; 它是一个容器控制器&#xff0c;专门用来管理一…

Microsoft前后端不分离编程新风向:cshtml

文章目录 什么是CSHTML&#xff1f;基础语法内联表达式代码块控制结构 布局页面_ViewStart.cshtml_Layout.cshtml使用布局 模型绑定强类型视图模型集合 HTML辅助方法基本表单验证 局部视图创建局部视图使用局部视图 高级特性视图组件依赖注入Tag Helpers 性能优化缓存捆绑和压缩…

【SpringBoot+SpringCloud】Linux配置nacos踩坑大全

*建议在开发时使用Linux环境下搭建nacos 1.在nacos官网找到搭配SpringBoot和SpringCloud的版本 2.Nacos 依赖 Java 环境来运行&#xff0c;需要在linux系统中安装JDK 1.8 3.按照Nacos官网步骤安装&#xff0c;防火墙配置开放8848和9848端口 客户端拥有相同的计算逻辑&…