仓储层当前有接口 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进行数据访问,并实现了统一的批量依赖注入的更多相关文章

  1. 前端axios发送的数据后端接收不到(没有自动依赖注入)可能的原因

    前端请求头content-type没有进行正确设置,后端无法解析该类型数据,比如说: 后端若想接收json类型的数据,则需要配置相应的转换器,(spring中可使用@RequestBody注解),若没 ...

  2. 数据访问与sql语句的管理(一)

    在开发过程中数据访问是必不可少的.每个框架都会有自己数据访问机制.大家在一般的情况下会为自己的框架配备2套数据访问机制,ORM和DataHelper.当然,根据项目的需要有时候也可能只一种. 其实这2 ...

  3. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

  4. 【SpringBoot实战】数据访问

    前言 在开发中我们通常会对数据库的数据进行操作,SpringBoot对关系性和非关系型数据库的访问操作都提供了非常好的整合支持.SpringData是spring提供的一个用于简化数据库访问.支持云服 ...

  5. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  6. 高性能Javascript--高效的数据访问

    接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 参考摘录<高性能Javascript>. 经典计算机科学的一个问题是, ...

  7. 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  8. Hibernate(1)——数据访问层的架构模式

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...

  9. 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...

  10. ADO.NET数据访问模板整理

    /// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...

随机推荐

  1. 企架布道:中电金信应邀出席2023佛山敏捷之旅暨DevOps Meetup

    近日,2023佛山敏捷之旅暨DevOps Meetup活动顺利举行,本次活动以助力大湾区金融和互联网企业敏捷DevOps实施和效能提升为主题,共设立 2个会场,16个话题分享,200余位金融.互联网企 ...

  2. k8s.HPA.使用自定义指标Pod自动扩容

    k8s.HPA.使用自定义指标Pod自动扩容 环境 env : kubernetes v1.22 metrics-server 0.6.1 prometheus v2.36.1 prometheus- ...

  3. Elm 和 Jetpack Compose 殊途同归及 MVVM 缺点分析

    Html.lazy · An Introduction to Elm 可能搞 vdom 的都会到 lazy renderer 这一步,react 可能也可以这么搞或者已经这么搞了我不知道,Elm 提到 ...

  4. Kali Linux上安装Openvas 漏洞分析器

    第一步:安装 apt-get update apt-get install openvas openvas-setup 第二步:自定义密码 openvas-stop #停止openvas服务 open ...

  5. Qt开源作品3-串口调试助手

    一.前言 这个作品很多年前就做了,经过了长达七八年的完善,当然也不是全身心的投入完善,也就是根据实际项目的需求不断完善的,尤其是模拟设备回复数据的功能,这个在很多用Qt做上位机开发非常实用,毕竟很多软 ...

  6. 使用Visual Studio Code进行前端开发并运行前端页面时提示:npm WARN Local package.json exists, but node_modules missing, did you mean to install?

    使用Visual Studio Code进行前端开发并运行前端页面时提示如下错误: npm WARN Local package.json exists, but node_modules missi ...

  7. ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置

    ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置为: 当前登录系统的用户目录下(如"C:\Users\Administrator\.ivy2\cache"), ...

  8. COCI 2024/2025 #3

    T1 P11474 [COCI 2024/2025 #3] 公交车 / Autobus 愤怒,从红升橙足以说明其恶心,考场上调了半小时才过. 这道题的车能够开 \(24\) 小时,并且他能从前一天开到 ...

  9. 【Git】fatal: refusing to merge unrelated histories

    git pull origin master --allow-unrelated-histories

  10. CDS标准视图:银行对账单抬头 I_BankStatement

    视图名称:银行对账单抬头 I_BankStatement 视图类型:基础 视图代码: 点击查看代码 事务代码:FF67/ 视图结构: 字段名称 技术名称 短代码 BANKSTATEMENTSHORTI ...