博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core 中基于工厂的中间件激活
阅读量:4034 次
发布时间:2019-05-24

本文共 3306 字,大约阅读时间需要 11 分钟。

IMiddlewareFactory/IMiddleware 是中间件激活的扩展点。

UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware。 如果是,则使用在容器中注册的 IMiddlewareFactory 实例来解析 IMiddleware 实现,而不使用基于约定的中间件激活逻辑。 中间件在应用的服务容器中注册为作用域或瞬态服务。

优点:

  • 按客户端请求(作用域服务的注入)激活

  • 让中间件强类型化

IMiddleware 按客户端请求(连接)激活,因此作用域服务可以注入到中间件的构造函数中。

IMiddleware

IMiddleware 定义应用的请求管道的中间件。InvokeAsync(HttpContext, RequestDelegate) 方法处理请求,并返回代表中间件执行的 Task。

使用约定激活的中间件:

public class ConventionalMiddleware{    private readonly RequestDelegate _next;    public ConventionalMiddleware(RequestDelegate next)    {        _next = next;    }    public async Task InvokeAsync(HttpContext context, AppDbContext db)    {        var keyValue = context.Request.Query["key"];        if (!string.IsNullOrWhiteSpace(keyValue))        {            db.Add(new Request()                {                    DT = DateTime.UtcNow,                     MiddlewareActivation = "ConventionalMiddleware",                     Value = keyValue                });            await db.SaveChangesAsync();        }        await _next(context);    }}

使用 MiddlewareFactory 激活的中间件:

public class FactoryActivatedMiddleware : IMiddleware{    private readonly AppDbContext _db;    public FactoryActivatedMiddleware(AppDbContext db)    {        _db = db;    }    public async Task InvokeAsync(HttpContext context, RequestDelegate next)    {        var keyValue = context.Request.Query["key"];        if (!string.IsNullOrWhiteSpace(keyValue))        {            _db.Add(new Request()                {                    DT = DateTime.UtcNow,                     MiddlewareActivation = "FactoryActivatedMiddleware",                     Value = keyValue                });            await _db.SaveChangesAsync();        }        await next(context);    }}

程序会为中间件创建扩展:

public static class MiddlewareExtensions{    public static IApplicationBuilder UseConventionalMiddleware(        this IApplicationBuilder builder)    {        return builder.UseMiddleware
(); } public static IApplicationBuilder UseFactoryActivatedMiddleware( this IApplicationBuilder builder) { return builder.UseMiddleware
(); }}

无法通过 UseMiddleware 将对象传递给工厂激活的中间件:

public static IApplicationBuilder UseFactoryActivatedMiddleware(    this IApplicationBuilder builder, bool option){    // Passing 'option' as an argument throws a NotSupportedException at runtime.    return builder.UseMiddleware
(option);}

将工厂激活的中间件添加到 Startup.ConfigureServices 的内置容器中:

public void ConfigureServices(IServiceCollection services){    services.AddDbContext
(options => options.UseInMemoryDatabase("InMemoryDb")); services.AddTransient
(); services.AddRazorPages();}

两个中间件均在 Startup.Configure 的请求处理管道中注册:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){    if (env.IsDevelopment())    {        app.UseDeveloperExceptionPage();    }    else    {        app.UseExceptionHandler("/Error");    }    app.UseConventionalMiddleware();    app.UseFactoryActivatedMiddleware();    app.UseStaticFiles();    app.UseRouting();    app.UseEndpoints(endpoints =>    {        endpoints.MapRazorPages();    });}

IMiddlewareFactory

IMiddlewareFactory 提供中间件的创建方法。 中间件工厂实现在容器中注册为作用域服务。

可在 Microsoft.AspNetCore.Http 包中找到默认的 IMiddlewareFactory 实现(即 MiddlewareFactory)。

转载地址:http://ixkdi.baihongyu.com/

你可能感兴趣的文章
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
ArrayList集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>