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
中配置的连接字符串正确,否则无法建立数据库连接。在不同的环境(开发、测试、生产)中,要注意切换相应的配置。 - 实体类特性使用:使用
SugarTable
和SugarColumn
等特性时,要准确设置属性,避免因特性设置错误导致数据库表结构创建或数据映射出现问题。 - 单例模式的影响:
ISqlSugarClient
以单例模式注册,在多线程环境下要注意线程安全问题,虽然 SqlSugar 本身在设计上考虑了多线程场景,但在复杂的业务逻辑中,仍需谨慎处理共享资源的访问。
通过以上对 SqlSugar 结合依赖注入与仓储模式的代码分析和示例展示,相信大家对如何在 C# 项目中高效地进行数据库操作有了更深入的了解。合理运用这些技术,能够让我们的项目在数据访问层面更加稳健和灵活,为整个应用的稳定运行提供有力支持。如果你在实际使用过程中遇到问题或有更好的实践经验,欢迎在评论区交流分享。
上述博客详细讲解了代码的功能与应用。若你觉得内容还需补充,比如增加更多复杂操作示例或优化说明,可随时告知我。
相关文章:
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...