gpt4 book ai didi

详解ASP.NET Core 中基于工厂的中间件激活的实现方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解ASP.NET Core 中基于工厂的中间件激活的实现方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

优点:

  • 按客户端请求(作用域服务的注入)激活
  • 让中间件强类型化

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

IMiddleware 。

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

使用约定激活的中间件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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激活的中间件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class MiddlewareExtensions
{
  public static IApplicationBuilder UseConventionalMiddleware(
   this IApplicationBuilder builder)
  {
   return builder.UseMiddleware<ConventionalMiddleware>();
  }
 
  public static IApplicationBuilder UseFactoryActivatedMiddleware(
   this IApplicationBuilder builder)
  {
   return builder.UseMiddleware<FactoryActivatedMiddleware>();
  }
}

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

?
1
2
3
4
5
6
public static IApplicationBuilder UseFactoryActivatedMiddleware(
  this IApplicationBuilder builder, bool option)
{
  // Passing 'option' as an argument throws a NotSupportedException at runtime.
  return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}

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

?
1
2
3
4
5
6
7
8
9
public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<AppDbContext>(options =>
   options.UseInMemoryDatabase( "InMemoryDb" ));
 
  services.AddTransient<FactoryActivatedMiddleware>();
 
  services.AddRazorPages();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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).

到此这篇关于ASP.NET Core 中基于工厂的中间件激活详解的文章就介绍到这了,更多相关ASP.NET Core中间件激活内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.cnblogs.com/yangzhili/p/13972314.html 。

最后此篇关于详解ASP.NET Core 中基于工厂的中间件激活的实现方法的文章就讲到这里了,如果你想了解更多关于详解ASP.NET Core 中基于工厂的中间件激活的实现方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com