asp.net core 自定义中间件【以dapper为例】
在asp.net core开发中。按照国际案例开始。都是先在Nuget安装XXX包。比如我们今天要用到的Dapper
nuget里面安装Dapper
1.然后新建一个类文件DapperExtensions.cs
因为Dapper是IDbConnection扩展出来的,所以我们必须给IDbConnection一个默认的实现
/// <summary>
/// 注入服务
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="service"></param>
/// <returns></returns>
public static IServiceCollection AddDapper<T>(this IServiceCollection service) where T:class,IDbConnection
{
service.AddScoped<IDbConnection, T>();
return service;
}
如何使用呢?在Startup里面加入
services.AddDapper();
理论上到这里,就已经可以勉强使用了。但是本文是记录中间件的学习,所以我们还是得在后面学习一下中间件的写法
2.新建一个DapperMiddleWareExtensions.cs和DapperMiddleWare.cs文件
public class DapperMiddleWare
{
private readonly RequestDelegate _next;
private DapperOption _option;
public DapperMiddleWare(RequestDelegate next, DapperOption option)
{
_next = next;
this._option = option;
}
public async Task InvokeAsync(HttpContext context)
{
var conn = context.RequestServices.GetService<IDbConnection>();
if (_option != default(DapperOption))
{
if (!_option.connStr.IsNull())
{
conn.ConnectionString = _option.connStr;
}
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
}
public static class DapperMiddleWareExtensions
{
public static IApplicationBuilder UseDapper(this IApplicationBuilder builder, Action<DapperOption> option = null)
{
DapperOption opt = new DapperOption();
if (option != null)
{
option(opt);
}
return builder.UseMiddleware<DapperMiddleWare>(opt);
}
}
使用:
app.UseDapper(opt =>
{
opt.connStr = Configuration[“db:mysqlmaster”];
});
这两段代码非常简单。就是编写一个IApplicationBuilder的扩展方法,然后再扩展方法里面获取到注入的IDbconnection的接口,然后把委托方法传递进来的默认配置参数赋值进去,就可以了。
实际上,也可以在AddService的时候就可以把委托配置给赋值进去,很多第三方的库就是这么做的。
分类:
.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端