如何使用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 ...
随机推荐
- 聊一聊 C#后台线程 如何阻塞程序退出
一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程 ...
- 【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
如题报错截图如上,解决方法如下 第一步:找到[引用]中的MySql.Data中的版本号 第二步,在Web.config中添加如下配置 <system.data> <DbProvide ...
- Git commit - Angular Convention
使用 Git 的开发者会使用 git commit 进行代码提交,也会使用 -m 提交commit message.对于一些个人开发者,也许他们会觉得"这是我个人的项目,不用太在意git c ...
- NoSuchAlgorithmException
今天在写UT时遇到了下面的问题: 1. 使用的powermock来处理static方法; 2. 静态方法里的却有使用到org.apache.http.client(4.3.1)的方法 异常如下: Ca ...
- [转]关于opencv4.0中“未定义标识符cvNamedWindow”的解决方法
这个问题困扰了很久,在网上找了很多方法,但是都没用, 比如:"在代码开头加入头文件#include <opencv2/highgui/highgui_c.h>"之类的方 ...
- IM群聊消息的已读未读功能在存储空间方面的实现思路探讨
1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...
- vivo手机上的系统级消息推送平台的架构设计实践
本文由vivo互联网服务器团队李青鑫分享,有较多修订和改动. 1.引言 本文内容来自vivo互联网服务器团队李青鑫在"2021 vivo开发者大会"现场的演讲内容整理而成(现场演讲 ...
- Python学习(一)——配套《PyTorch深度学习实战》
记录一下Python学习过程中的一些问题: 1. 在JupyterLab中查询当前文件的地址 import os print(os.getcwd()) #查询该文件的地址 2. 新建cell 在 Ju ...
- SequoiaDB数据库-new数据库
随着企业中日益复杂与多变的需求,以及迅速扩展带来的海量数据的业务,IT部门需要将越来越多的信息提供给用户,同时在现今的全球经济背景环境下,IT部 门还需要在提供高效服务的同时,降低其设备与程序维护成本 ...
- Linux操作系统基础知识
一.输入法的切换Application ----> System Tools ----> Settings ----> Rejino&language ----> In ...