.net 8 web api使用SqlSugar搭建倉儲模式+Autofac依賴注入
廢話少說直接上重點,使用SqlSugar搭建倉儲模式,之前自己搭建的一個相對基礎同時還算穩定的一個框架;【不想看過程的直接拉取本文代碼Github】
創建解決方案....創建項目省過...結果如圖:

倉儲服務和倉儲實現,業務服務以及業務實現外加一個webapi;
我們先從SqlSugarCore項目開始:
1.添加SqlSugarCore引用
dotnet add package SqlSugarCore --version 5.1.4.177
這個類庫項目用來提供實體依賴【個人拿來存數據庫實體用】
接下來上重點了;
搭建倉儲與基礎服務:
1.在IRepository中添加SqlSugarCore項目引用,再建一個IBaseRepository接口類,代碼如下:
using SqlSugar;
namespace LHJ.IRepository;
/// <summary>
/// 基類接口,其他接口繼承該接口
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IBaseRepository<TEntity> where TEntity : class
{
/// <summary>
/// 根據ID查詢
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
Task<TEntity> QueryByID(object objId);
/// <summary>
/// 添加
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Add(TEntity model);
/// <summary>
/// 修改
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Update(TEntity model);
/// <summary>
/// 刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<bool> DeleteByIds(object[] ids);
/// <summary>
/// 獲取db對象
/// </summary>
/// <param name="config"></param>
/// <returns></returns>
public SqlSugarClient GetDb(string config = "0");
}
注意:GetDb方法用來向外提供DbBase,參數自己可以根據后面實例化DbContext時傳入對應數據庫的configId
服務接口有了,接下來就是具體實現:
在Repository項目中添加SqlSugar的Nuget引用后新建一個DbContext類,代碼如下:
using SqlSugar;
namespace LHJ.Repository;
public class DbContext<T> where T : class, new()
{
public DbContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
ConfigId = "0",
ConnectionString = BaseDBConfig.ConnectionString,
DbType = DbType.SqlServer,
InitKeyType = InitKeyType.Attribute,//從特性讀取主鍵和自增列信息
IsAutoCloseConnection = true,//開啟自動釋放模式
});
//調式代碼 用來打印SQL
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" +
Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
public SqlSugarClient Db;//用來處理事務多表查詢和復雜的操作
public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用來操作當前表的數據
//public SimpleClient<Users> UserDb { get { return new SimpleClient<Users>(Db); } }
}
DbContext用來初始化數據庫連接,然后再建一個倉儲實現類BaseRepository.cs,代碼如下:
namespace LHJ.Repository;
/// <summary>
/// 基類實現
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new()
{
/// <summary>
/// 寫入實體數據
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Add(TEntity model)
{
//這里需要注意的是,如果使用了Task.Run()就會導致 sql語句日志無法記錄改成下面的
//var i = await Task.Run(() => Db.Insertable(model).ExecuteCommand());
var i = await Db.Insertable(model).ExecuteCommandAsync();
return i > 0;
}
/// <summary>
/// 根據ID刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<bool> DeleteByIds(object[] ids)
{
var i = await Db.Deleteable<TEntity>().In(ids).ExecuteCommandAsync();
return i > 0;
}
/// <summary>
/// 根據ID查詢一條數據
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
public async Task<TEntity> QueryByID(object objId)
{
return await Db.Queryable<TEntity>().InSingleAsync(objId);
}
/// <summary>
/// 更新實體數據
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Update(TEntity model)
{
//這種方式會以主鍵為條件
var i = await Db.Updateable(model).ExecuteCommandAsync();
return i > 0;
}
public SqlSugarClient GetDb(string configId) => Db;
}
這里我們繼承了IBaseRepository類,同時也基礎了DbContext類,這樣我們就能通過DbContext實現對應基礎數據交互操作;
同時再建一個配置類BaseDBConfig.cs,代碼如下:
namespace LHJ.Repository;
public class BaseDBConfig
{
/// <summary>
/// 數據庫連接字符串oracle
/// </summary>
public static string? ConnectionString { get; set; }
}
這里是用來存儲數據庫字符串,我自己處理單庫,如果要多庫請使用:
public static List<string>? ConnectionString { get; set; }
這里我建議大家可以單據建一個類庫用來提供公共配置支持配置信息【個人搭建寫完了才發現,就懶得改了】,還有使用靜態字段存儲鏈接字符其實是不恰當的,應該在DBContext初始化的時候讀一次配置文件,這樣發布后更改數據庫相對方便;【主要是為了演示如何搭建,就不改了】
倉儲有了,我們就可以搭建邏輯業務,在項目IService中新建IBaseService接口類,代碼如下:
namespace LHJ.IService;
public interface IBaseService<TEntity> where TEntity : class
{
/// <summary>
/// 根據ID列表刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<bool> DeleteByIds(object[] ids);
/// <summary>
/// 根據ID查詢
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
Task<TEntity> QueryByID(object objId);
/// <summary>
/// 添加實體
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Add(TEntity model);
/// <summary>
/// 更新實體
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Update(TEntity model);
}
在Service項目中新建服務基類Service.cs,代碼如下:
/// <summary>
/// 服務基類
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class BaseService<TEntity> : IBaseService<TEntity> where TEntity : class, new()
{
private readonly IBaseRepository<TEntity> baseDal;
//這里使用依賴注入
public BaseService(IBaseRepository<TEntity> baseRepository)
{
baseDal = baseRepository;
}
/// <summary>
/// 寫入實體
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Add(TEntity model)
{
return await baseDal.Add(model);
}
/// <summary>
/// 根據ID刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<bool> DeleteByIds(object[] ids)
{
return await baseDal.DeleteByIds(ids);
}
/// <summary>
/// 根據ID查詢
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
public async Task<TEntity> QueryByID(object objId)
{
return await baseDal.QueryByID(objId);
}
/// <summary>
/// 更新實體
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Update(TEntity model)
{
return await baseDal.Update(model);
}
}
到此后端的架構基本上算是完成了,但是這個時候啟動項目是不會實現基礎服務,因此我們需要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,代碼如下:
using Autofac;
using Autofac.Extras.DynamicProxy;
using System.Reflection;
namespace LHJ.WebHost;
public class AutofacModuleRegister : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
//注冊服務
//builder.RegisterType<TestService>().As<ITestService>();
//builder.RegisterType<TestRepository>().As<ITestRepository>();
//注冊Service
var assemblysServices = Assembly.Load("LHJ.Service");
builder.RegisterAssemblyTypes(assemblysServices)
.InstancePerDependency()//默認模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象
.AsImplementedInterfaces()//是以接口方式進行注入,注入這些類的所有的公共接口作為服務(除了釋放資源)
.EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy;應用攔截器
//注冊Repository
var assemblysRepository = Assembly.Load("LHJ.Repository");
builder.RegisterAssemblyTypes(assemblysRepository)
.InstancePerDependency()//默認模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象
.AsImplementedInterfaces()//是以接口方式進行注入,注入這些類的所有的公共接口作為服務(除了釋放資源)
.EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy;應用攔截器
}
}
根據程序集注冊,請求一次實例化注入一次服務,請求結束自動釋放繼承IDisposable的對象資源;
在appsettings.json中配置你自己的連接字符串:
"AppSetting": {
"ConnectionStringSqlServer": "Data Source=xxxx;Initial Catalog=your_Db;User Id=sa;Password=xxxx;Encrypt=True;TrustServerCertificate=True;",
"ConnectionStringOracle": "Server=.;Database=BookStore;Trusted_Connection=True;TrustServerCertificate=True"
}
而后在Program.cs中啟用以上配置,代碼如下:
using Autofac;
using Autofac.Extensions.DependencyInjection;
using LHJ.Repository;
using LHJ.WebHost;
var builder = WebApplication.CreateBuilder(args);
// 使用 Autofac 作為服務容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
// 配置 Autofac 容器
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
// 注冊服務
containerBuilder.RegisterModule(new AutofacModuleRegister());
});
// Add services to the container.
builder.Services.AddControllers();
BaseDBConfig.ConnectionString = builder.Configuration.GetSection("AppSetting:ConnectionStringSqlServer").Value;
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
// app.UseSwagger();
// app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI();
app.UseAuthorization();
app.MapControllers();
app.Run();
如果需要使用多庫,則將數據庫配置全部讀進BaseDBConfig.ConnectionString;
這個時候你的項目【Webhost】應該可以正常啟動,我們在SqlSugarCore項目下新建一個實體類Users.cs,代碼如下:
using SqlSugar;
namespace LHJ.SqlSugarCore.Entities;
/// <summary>
///
///</summary>
[SugarTable("User")]
public class Users
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "Name")]
public string? Name { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "Email")]
public string? Email { get; set; }
}
IService項目下新建一個類ITestService,代碼如下:
using LHJ.SqlSugarCore.Entities;
namespace LHJ.IService.IServices;
public interface ITestService:IBaseService<Users>
{
}
在Service項目中新建TestService類用于實現測試的接口類,代碼如下:
using LHJ.IRepository;
using LHJ.IService.IServices;
using LHJ.SqlSugarCore.Entities;
namespace LHJ.Service.Services;
public class TestService : BaseService<Users>, ITestService
{
IBaseRepository<Users> _baseRepository;
public TestService(IBaseRepository<Users> baseRepository) : base(baseRepository)
{
_baseRepository = baseRepository;
}
}
在IRepository項目中新建ITestRepository.cs類,代碼如下:
using LHJ.SqlSugarCore.Entities;
namespace LHJ.IRepository.ManagerRepository;
public interface ITestPlanRepository : IBaseRepository<Users>
{
}
在Repository中新建TestPlanRepository類基礎ITestRepository,代碼如下:
using LHJ.IRepository.ManagerRepository;
using LHJ.SqlSugarCore.Entities;
namespace LHJ.Repository.SugarRepository;
public class TestRepository : BaseRepository<Users>, ITestPlanRepository
{
}
最后添加一個控制器TestController.cs,代碼如下:
using LHJ.IService.IServices;
using LHJ.SqlSugarCore.Entities;
using Microsoft.AspNetCore.Mvc;
namespace LHJ.WebHost.Controllers;
[ApiController]
[Route("api/[controller]/[action]")]
public class TestController : ControllerBase
{
private readonly ITestService testService;
public TestController(ITestService _testService) { this.testService = _testService; }
[HttpGet]
public Task<Users> GetUser(int Id)
{
return testService.QueryByID(Id);
}
}
然后啟動項目【Webhost】確保你使用的數據庫與實體類符合,然后查詢

完成!!

浙公網安備 33010602011771號