如何使用ISqlSugarClient进行数据访问,并实现了统一的批量依赖注入
仓储层当前有接口 IRepository<T> 抽象类 BaseRepository<T> 业务逻辑层有抽象类 BaseBusiness<M, E> 接口 IBusiness<M, E>,其中使用ISqlSugarClient,其中还有E表示 BaseEntity,M为 BaseDto 请用C# 给出一个案例,支持不同表对应不同的业务逻辑层,然后不同仓储实例,不同表的业务,都实现统一的批量依赖注入。
以下是一个更新后的C#示例,演示了如何使用ISqlSugarClient进行数据访问,并实现了统一的批量依赖注入:
using System;
using System.Collections.Generic;
using SqlSugar; // 实体类
public class BaseEntity
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
// 其他实体属性...
} public class ProductEntity : BaseEntity
{
public string Name { get; set; }
// 其他产品实体属性...
} public class CustomerEntity : BaseEntity
{
public string FirstName { get; set; }
public string LastName { get; set; }
// 其他客户实体属性...
} // 数据传输对象(DTO)
public class BaseDto
{
// 公共DTO属性...
} public class ProductDto : BaseDto
{
public string Name { get; set; }
// 其他产品DTO属性...
} public class CustomerDto : BaseDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
// 其他客户DTO属性...
} // 仓储层
public interface IRepository<T>
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
T GetById(int id);
// 其他仓储操作方法...
} public abstract class BaseRepository<T> : IRepository<T> where T : BaseEntity
{
protected readonly ISqlSugarClient _db; public BaseRepository(ISqlSugarClient db)
{
_db = db;
} public void Add(T entity)
{
_db.Insertable(entity).ExecuteCommand();
} public void Update(T entity)
{
_db.Updateable(entity).ExecuteCommand();
} public void Delete(T entity)
{
_db.Deleteable<T>().In(entity.Id).ExecuteCommand();
} public T GetById(int id)
{
return _db.Queryable<T>().InSingle(id);
} // 其他仓储操作方法的实现...
} // 业务逻辑层
public interface IBusiness<M, E> where M : BaseDto where E : BaseEntity
{
void Process(M model);
// 其他业务逻辑方法...
} public abstract class BaseBusiness<M, E> : IBusiness<M, E> where M : BaseDto where E : BaseEntity
{
protected readonly IRepository<E> _repository; public BaseBusiness(IRepository<E> repository)
{
_repository = repository;
} public abstract void Process(M model);
// 其他业务逻辑方法...
} // 具体业务逻辑类
public class ProductBusiness : BaseBusiness<ProductDto, ProductEntity>
{
public ProductBusiness(IRepository<ProductEntity> repository) : base(repository)
{
} public override void Process(ProductDto model)
{
// 实现产品业务逻辑
Console.WriteLine("Processing product: " + model.Name);
}
} public class CustomerBusiness : BaseBusiness<CustomerDto, CustomerEntity>
{
public CustomerBusiness(IRepository<CustomerEntity> repository) : base(repository)
{
} public override void Process(CustomerDto model)
{
// 实现客户业务逻辑
Console.WriteLine("Processing customer: " + model.FirstName + " " + model.LastName);
}
} // 批量依赖注入容器
public class DependencyInjector
{
private readonly ISqlSugarClient _db; public DependencyInjector(ISqlSugarClient db)
{
_db = db;
} public IEnumerable<BaseBusiness<M, E>> ResolveBusinesses<M, E>() where M : BaseDto where E : BaseEntity
{
var repositoryType = typeof(IRepository<E>);
var businessType = typeof(IBusiness<M, E>); var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var businessTypes = new List<Type>(); foreach (var assembly in assemblies)
{
var types = assembly.GetTypes();
foreach (var type in types)
{
if (type.BaseType != null && type.BaseType.IsGenericType)
{
var baseType = type.BaseType.GetGenericTypeDefinition();
if (baseType == businessType)
{
businessTypes.Add(type);
}
}
}
} foreach (var businessTypeItem in businessTypes)
{
var repositoryGenericType = repositoryType.MakeGenericType(businessTypeItem.GetGenericArguments());
var repository = Activator.CreateInstance(repositoryGenericType, _db);
var business = Activator.CreateInstance(businessTypeItem, repository); yield return (BaseBusiness<M, E>)business;
}
}
} // 使用示例
class Program
{
static void Main(string[] args)
{
// 模拟ISqlSugarClient的实例
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "YourConnectionString",
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
}); // 实例化依赖注入容器
var injector = new DependencyInjector(db); // 解析并实例化业务逻辑类
var businesses = injector.ResolveBusinesses<BaseDto, BaseEntity>(); // 使用业务逻辑类进行操作
foreach (var business in businesses)
{
// 处理业务逻辑
business.Process(new ProductDto { Name = "Sample Product" });
business.Process(new CustomerDto { FirstName = "John", LastName = "Doe" });
}
}
}
原创,转载请说明出处。
如何使用ISqlSugarClient进行数据访问,并实现了统一的批量依赖注入的更多相关文章
- 前端axios发送的数据后端接收不到(没有自动依赖注入)可能的原因
前端请求头content-type没有进行正确设置,后端无法解析该类型数据,比如说: 后端若想接收json类型的数据,则需要配置相应的转换器,(spring中可使用@RequestBody注解),若没 ...
- 数据访问与sql语句的管理(一)
在开发过程中数据访问是必不可少的.每个框架都会有自己数据访问机制.大家在一般的情况下会为自己的框架配备2套数据访问机制,ORM和DataHelper.当然,根据项目的需要有时候也可能只一种. 其实这2 ...
- SpringBoot数据访问(一) SpringBoot整合Mybatis
前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...
- 【SpringBoot实战】数据访问
前言 在开发中我们通常会对数据库的数据进行操作,SpringBoot对关系性和非关系型数据库的访问操作都提供了非常好的整合支持.SpringData是spring提供的一个用于简化数据库访问.支持云服 ...
- ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...
- 高性能Javascript--高效的数据访问
接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 参考摘录<高性能Javascript>. 经典计算机科学的一个问题是, ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- Hibernate(1)——数据访问层的架构模式
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...
- 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...
- ADO.NET数据访问模板整理
/// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...
随机推荐
- 如何在 Linux 中使用 grep 命令的排除功能
来自grep 是一种强大的命令行工具,用于在一个或多个输入文件中搜索与正则表达式匹配的行,并将匹配的行标准输出.在本文中介绍如何在使用 grep 搜索时排除一个或多个单词或目录. 排除单词或多个条 ...
- Qt/C++地图动态绘制折线多边形矩形圆形标注点/可编辑拖动调整大小和位置
一.前言说明 无论哪一家的地图,都提供了调用函数绘制各种覆盖物,但是有时候的场景是希望进入添加覆盖物模式,然后每次在地图上按下都自动生成对应的覆盖物比如圆形,这样就不需要用户提前知道经纬度坐标等参数, ...
- Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
一.前言 之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖, ...
- ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置
ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置为: 当前登录系统的用户目录下(如"C:\Users\Administrator\.ivy2\cache"), ...
- C#HTTP网络编程的一般流程
1.同步HTTP网络要求 //第1步: 送出要求 string url="https://www.baidu.com/"; HttpWebRequest request = (Ht ...
- 即时通讯技术文集(第20期):IM架构设计技术文章(Part3) [共14篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第20 期. [-1-] 融云技术分享:全面揭秘亿级IM消息的可靠投递机制 [链接] http: ...
- 概率图模型&机器学习 -- 精确推断方法 -- 变量消去(Variable Elimination)和信念传播(Belief Propagation)
参考资料 西瓜书 An introduction to hidden Markov model -- Rabiner, Juang [机器学习][白板推导系列][合集 1-33]_哔哩哔哩_bilib ...
- C#中如何使用异步编程
在 C# 中,异步编程主要通过 async 和 await 关键字来实现.异步编程的目的是让程序在执行耗时操作(如 I/O 操作.网络请求等)时不会阻塞主线程,从而提高程序的性能. 1. 异步编程的核 ...
- asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计
如果一个Controller.Action里的处理非常耗时,比如读数据库.文件操作.调用第三方接口等此时用户随时可能关闭浏览器.F5刷新网页等操作.但是服务端的耗时代码任然在执行,这太浪费了,既然用户 ...
- 在OERV也可以玩MC(上)
最近发现一个比较有意思的事情,原来HMCL这个项目也移植到RISC-V上了,之前一直没有发现,因此在OERV(openEuler RISC-V的简称)玩MC也是可以的了.首先,HMCL是一款功能丰富的 ...