.net 8 web api使用SqlSugar搭建仓储模式+Autofac依靠注入

打印 上一主题 下一主题

主题 951|帖子 951|积分 2853

废话少说直接上重点,使用SqlSugar搭建仓储模式,之前自己搭建的一个相对基础同时还算稳固的一个框架;
创建解决方案....创建项目省过...效果如图:

仓储服务和仓储实现,业务服务以及业务实现外加一个webapi;
我们先从SqlSugarCore项目开始:
1.添加SqlSugarCore引用
dotnet add package SqlSugarCore --version 5.1.4.177
这个类库项目用来提供实体依靠【个人拿来存数据库实体用】
接下来上重点了;
搭建仓储与基础服务:
1.在IRepository中添加SqlSugarCore项目引用,再建一个IBaseRepository接口类,代码如下:
  1. using SqlSugar;
  2. namespace LHJ.IRepository;
  3. /// <summary>
  4. /// 基类接口,其他接口继承该接口
  5. /// </summary>
  6. /// <typeparam name="TEntity"></typeparam>
  7. public interface IBaseRepository<TEntity> where TEntity : class
  8. {
  9.     /// <summary>
  10.     /// 根据ID查询
  11.     /// </summary>
  12.     /// <param name="objId"></param>
  13.     /// <returns></returns>
  14.     Task<TEntity> QueryByID(object objId);
  15.     /// <summary>
  16.     /// 添加
  17.     /// </summary>
  18.     /// <param name="model"></param>
  19.     /// <returns></returns>
  20.     Task<bool> Add(TEntity model);
  21.     /// <summary>
  22.     /// 修改
  23.     /// </summary>
  24.     /// <param name="model"></param>
  25.     /// <returns></returns>
  26.     Task<bool> Update(TEntity model);
  27.     /// <summary>
  28.     /// 删除
  29.     /// </summary>
  30.     /// <param name="ids"></param>
  31.     /// <returns></returns>
  32.     Task<bool> DeleteByIds(object[] ids);
  33.     /// <summary>
  34.     /// 获取db对象
  35.     /// </summary>
  36.     /// <param name="config"></param>
  37.     /// <returns></returns>
  38.     public SqlSugarClient GetDb(string config = "0");
  39. }
复制代码
留意:GetDb方法用来向外提供DbBase,参数自己可以根据后面实例化DbContext时传入对应数据库的configId
服务接口有了,接下来就是详细实现:
在Repository项目中添加SqlSugar的Nuget引用后新建一个DbContext类,代码如下:
  1. using SqlSugar;
  2. namespace LHJ.Repository;
  3. public class DbContext<T> where T : class, new()
  4. {
  5.     public DbContext()
  6.     {
  7.         Db = new SqlSugarClient(new ConnectionConfig()
  8.         {
  9.             ConfigId = "0",
  10.             ConnectionString = BaseDBConfig.ConnectionString,
  11.             DbType = DbType.SqlServer,
  12.             InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
  13.             IsAutoCloseConnection = true,//开启自动释放模式
  14.         });
  15.         //调式代码 用来打印SQL
  16.         Db.Aop.OnLogExecuting = (sql, pars) =>
  17.         {
  18.             Console.WriteLine(sql + "\r\n" +
  19.                 Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
  20.             Console.WriteLine();
  21.         };
  22.     }
  23.     public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
  24.     public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来操作当前表的数据
  25.     //public SimpleClient<Users> UserDb { get { return new SimpleClient<Users>(Db); } }
  26. }
复制代码
DbContext用来初始化数据库连接,然后再建一个仓储实现类BaseRepository.cs,代码如下:
  1. namespace LHJ.Repository;
  2. /// <summary>
  3. /// 基类实现
  4. /// </summary>
  5. /// <typeparam name="TEntity"></typeparam>
  6. public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new()
  7. {
  8.     /// <summary>
  9.     /// 写入实体数据
  10.     /// </summary>
  11.     /// <param name="model"></param>
  12.     /// <returns></returns>
  13.     public async Task<bool> Add(TEntity model)
  14.     {
  15.         //这里需要注意的是,如果使用了Task.Run()就会导致 sql语句日志无法记录改成下面的
  16.         //var i = await Task.Run(() => Db.Insertable(model).ExecuteCommand());
  17.         var i = await Db.Insertable(model).ExecuteCommandAsync();
  18.         return i > 0;
  19.     }
  20.     /// <summary>
  21.     /// 根据ID删除
  22.     /// </summary>
  23.     /// <param name="ids"></param>
  24.     /// <returns></returns>
  25.     public async Task<bool> DeleteByIds(object[] ids)
  26.     {
  27.         var i = await Db.Deleteable<TEntity>().In(ids).ExecuteCommandAsync();
  28.         return i > 0;
  29.     }
  30.     /// <summary>
  31.     /// 根据ID查询一条数据
  32.     /// </summary>
  33.     /// <param name="objId"></param>
  34.     /// <returns></returns>
  35.     public async Task<TEntity> QueryByID(object objId)
  36.     {
  37.         return await Db.Queryable<TEntity>().InSingleAsync(objId);
  38.     }
  39.     /// <summary>
  40.     /// 更新实体数据
  41.     /// </summary>
  42.     /// <param name="model"></param>
  43.     /// <returns></returns>
  44.     public async Task<bool> Update(TEntity model)
  45.     {
  46.         //这种方式会以主键为条件
  47.         var i = await Db.Updateable(model).ExecuteCommandAsync();
  48.         return i > 0;
  49.     }
  50.     public SqlSugarClient GetDb(string configId) => Db;
  51. }
复制代码
这里我们继承了IBaseRepository类,同时也基础了DbContext类,这样我们就能通过DbContext实现对应基础数据交互操作;
同时再建一个配置类BaseDBConfig.cs,代码如下:
  1. namespace LHJ.Repository;
  2. public class BaseDBConfig
  3. {
  4.     /// <summary>
  5.     /// 数据库连接字符串oracle
  6.     /// </summary>
  7.     public static string? ConnectionString { get; set; }
  8. }
复制代码
这里是用来存储数据库字符串,我自己处置惩罚单库,如果要多库请使用:
public static List?  ConnectionString { get; set; }
这里我建议各人可以单据建一个类库用来提供公共配置支持配置信息【个人搭建写完了才发现,就懒得改了】,另有使用静态字段存储链接字符实在是不适当的,应该在DBContext初始化的时间读一次配置文件,这样发布后更改数据库相对方便;【主要是为了演示如何搭建,就不改了】
仓储有了,我们就可以搭建逻辑业务,在项目IService中新建IBaseService接口类,代码如下:
  1. namespace LHJ.IService;
  2. public interface IBaseService<TEntity> where TEntity : class
  3. {
  4.     /// <summary>
  5.     /// 根据ID列表删除
  6.     /// </summary>
  7.     /// <param name="ids"></param>
  8.     /// <returns></returns>
  9.     Task<bool> DeleteByIds(object[] ids);
  10.     /// <summary>
  11.     /// 根据ID查询
  12.     /// </summary>
  13.     /// <param name="objId"></param>
  14.     /// <returns></returns>
  15.     Task<TEntity> QueryByID(object objId);
  16.     /// <summary>
  17.     /// 添加实体
  18.     /// </summary>
  19.     /// <param name="model"></param>
  20.     /// <returns></returns>
  21.     Task<bool> Add(TEntity model);
  22.     /// <summary>
  23.     /// 更新实体
  24.     /// </summary>
  25.     /// <param name="model"></param>
  26.     /// <returns></returns>
  27.     Task<bool> Update(TEntity model);
  28. }
复制代码
在Service项目中新建服务基类Service.cs,代码如下:
  1. /// <summary>
  2. /// 服务基类
  3. /// </summary>
  4. /// <typeparam name="TEntity"></typeparam>
  5. public class BaseService<TEntity> : IBaseService<TEntity> where TEntity : class, new()
  6. {
  7.     private readonly IBaseRepository<TEntity> baseDal;
  8.     //这里使用依赖注入
  9.     public BaseService(IBaseRepository<TEntity> baseRepository)
  10.     {
  11.         baseDal = baseRepository;
  12.     }
  13.     /// <summary>
  14.     /// 写入实体
  15.     /// </summary>
  16.     /// <param name="model"></param>
  17.     /// <returns></returns>
  18.     public async Task<bool> Add(TEntity model)
  19.     {
  20.         return await baseDal.Add(model);
  21.     }
  22.     /// <summary>
  23.     /// 根据ID删除
  24.     /// </summary>
  25.     /// <param name="ids"></param>
  26.     /// <returns></returns>
  27.     public async Task<bool> DeleteByIds(object[] ids)
  28.     {
  29.         return await baseDal.DeleteByIds(ids);
  30.     }
  31.     /// <summary>
  32.     /// 根据ID查询
  33.     /// </summary>
  34.     /// <param name="objId"></param>
  35.     /// <returns></returns>
  36.     public async Task<TEntity> QueryByID(object objId)
  37.     {
  38.         return await baseDal.QueryByID(objId);
  39.     }
  40.     /// <summary>
  41.     /// 更新实体
  42.     /// </summary>
  43.     /// <param name="model"></param>
  44.     /// <returns></returns>
  45.     public async Task<bool> Update(TEntity model)
  46.     {
  47.         return await baseDal.Update(model);
  48.     }
  49. }
复制代码
到此后端的架构基本上算是完成了,但是这个时间启动项目是不会实现基础服务,因此我们必要Autofac注入实现我们的服务:
1.添加服务
dotnet add package Autofac.Extensions.DependencyInjection --version 10.0.0
2.还是添加包引用
dotnet add package Autofac.Extras.DynamicProxy --version 7.1.0
3.新建AutofacModuleRegister.cs类,用来配置Autofac,代码如下:
  1. using Autofac;
  2. using Autofac.Extras.DynamicProxy;
  3. using System.Reflection;
  4. namespace LHJ.WebHost;
  5. public class AutofacModuleRegister : Autofac.Module
  6. {
  7.     protected override void Load(ContainerBuilder builder)
  8.     {
  9.         //注册服务
  10.         //builder.RegisterType<TestService>().As<ITestService>();
  11.         //builder.RegisterType<TestRepository>().As<ITestRepository>();
  12.         //注册Service
  13.         var assemblysServices = Assembly.Load("LHJ.Service");
  14.         builder.RegisterAssemblyTypes(assemblysServices)
  15.             .InstancePerDependency()//默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象
  16.            .AsImplementedInterfaces()//是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
  17.            .EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy;应用拦截器
  18.         //注册Repository
  19.         var assemblysRepository = Assembly.Load("LHJ.Repository");
  20.         builder.RegisterAssemblyTypes(assemblysRepository)
  21.             .InstancePerDependency()//默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象
  22.            .AsImplementedInterfaces()//是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
  23.            .EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy;应用拦截器
  24.     }
  25. }
复制代码
根据步调集注册,请求一次实例化注入一次服务,请求结束自动开释继承IDisposable的对象资源;
在appsettings.json中配置你自己的连接字符串:
  1. "AppSetting": {
  2.   "ConnectionStringSqlServer": "Data Source=xxxx;Initial Catalog=your_Db;User Id=sa;Password=xxxx;Encrypt=True;TrustServerCertificate=True;",
  3.   "ConnectionStringOracle": "Server=.;Database=BookStore;Trusted_Connection=True;TrustServerCertificate=True"
  4. }
复制代码
而后在Program.cs中启用以上配置,代码如下:
  1. using Autofac;
  2. using Autofac.Extensions.DependencyInjection;
  3. using LHJ.Repository;
  4. using LHJ.WebHost;
  5. var builder = WebApplication.CreateBuilder(args);
  6. // 使用 Autofac 作为服务容器
  7. builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
  8. // 配置 Autofac 容器
  9. builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
  10. {
  11.     // 注册服务
  12.     containerBuilder.RegisterModule(new AutofacModuleRegister());
  13. });
  14. // Add services to the container.
  15. builder.Services.AddControllers();
  16. BaseDBConfig.ConnectionString = builder.Configuration.GetSection("AppSetting:ConnectionStringSqlServer").Value;
  17. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  18. builder.Services.AddEndpointsApiExplorer();
  19. builder.Services.AddSwaggerGen();
  20. var app = builder.Build();
  21. // Configure the HTTP request pipeline.
  22. //if (app.Environment.IsDevelopment())
  23. //{
  24. //    app.UseSwagger();
  25. //    app.UseSwaggerUI();
  26. //}
  27. app.UseSwagger();
  28. app.UseSwaggerUI();
  29. app.UseAuthorization();
  30. app.MapControllers();
  31. app.Run();
复制代码
如果必要使用多库,则将数据库配置全部读进BaseDBConfig.ConnectionString;
这个时间你的项目【Webhost】应该可以正常启动,我们在SqlSugarCore项目下新建一个实体类Users.cs,代码如下:
  1. using SqlSugar;
  2. namespace LHJ.SqlSugarCore.Entities;
  3. /// <summary>
  4. ///
  5. ///</summary>
  6. [SugarTable("User")]
  7. public class Users
  8. {
  9.     /// <summary>
  10.     ///  
  11.     ///</summary>
  12.     [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
  13.     public int Id  { get; set; }
  14.     /// <summary>
  15.     ///  
  16.     ///</summary>
  17.     [SugarColumn(ColumnName = "Name")]
  18.     public string? Name { get; set; }
  19.     /// <summary>
  20.     ///  
  21.     ///</summary>
  22.     [SugarColumn(ColumnName = "Email")]
  23.     public string? Email { get; set; }
  24. }
复制代码
IService项目下新建一个类ITestService,代码如下:
  1. using LHJ.SqlSugarCore.Entities;
  2. namespace LHJ.IService.IServices;
  3. public interface ITestService:IBaseService<Users>
  4. {
  5. }
复制代码
在Service项目中新建TestService类用于实现测试的接口类,代码如下:
  1. using LHJ.IRepository;
  2. using LHJ.IService.IServices;
  3. using LHJ.SqlSugarCore.Entities;
  4. namespace LHJ.Service.Services;
  5. public class TestService : BaseService<Users>, ITestService
  6. {
  7.     IBaseRepository<Users> _baseRepository;
  8.     public TestService(IBaseRepository<Users> baseRepository) : base(baseRepository)
  9.     {
  10.         _baseRepository = baseRepository;
  11.     }
  12. }
复制代码
在IRepository项目中新建ITestRepository.cs类,代码如下:
  1. using LHJ.SqlSugarCore.Entities;
  2. namespace LHJ.IRepository.ManagerRepository;
  3. public interface ITestPlanRepository : IBaseRepository<Users>
  4. {
  5. }
复制代码
在Repository中新建TestPlanRepository类基础ITestRepository,代码如下:
  1. using LHJ.IRepository.ManagerRepository;
  2. using LHJ.SqlSugarCore.Entities;
  3. namespace LHJ.Repository.SugarRepository;
  4. public class TestRepository : BaseRepository<Users>, ITestPlanRepository
  5. {
  6. }
复制代码
最后添加一个控制器TestController.cs,代码如下:
  1. using LHJ.IService.IServices;
  2. using LHJ.SqlSugarCore.Entities;
  3. using Microsoft.AspNetCore.Mvc;
  4. namespace LHJ.WebHost.Controllers;
  5. [ApiController]
  6. [Route("api/[controller]/[action]")]
  7. public class TestController : ControllerBase
  8. {
  9.     private readonly ITestService testService;
  10.     public TestController(ITestService _testService) { this.testService = _testService; }
  11.     [HttpGet]
  12.     public Task<Users> GetUser(int Id)
  13.     {
  14.         return testService.QueryByID(Id);
  15.     }
  16. }
复制代码
然后启动项目【Webhost】确保你使用的数据库与实体类符合,然后查询

完成!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表