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的时候就可以把委托配置给赋值进去,很多第三方的库就是这么做的。

 
 
posted @   天府三街第二帅  阅读(474)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示