我正在使用一个代码库(Minimal APIs:.NET 6(,它公开了一个通过扩展方法添加到IApplicationBuilder
的自定义中间件(UseCustomMiddleware
(。
UseCustomMiddleware
的第二个参数是用作提供认证机制的谓词的Func<HttpRequest, Identity, Message, ... Task<(bool Pass, Error Error)>
。
这是Program.cs:中的布局
builder.Services.AddScoped<AuthenticationService>();
var app = builder.Build();
app.UseCustomMiddleware<IContract,Methods>("/", async (httpRequest, accessibility, message, ...) =>
{
//resolving dependencies here is not a problem.
var authenticationService = app.Services.CreateScope().ServiceProvider.GetRequiredService<AuthenticationService>();
//the rest of logic continues...
});
一切都很好,但lambda内部的逻辑越来越长,我需要将其移到一个单独的类文件中。
我可以创建一个静态类,用Func<...>
的签名定义相同的静态方法,并引用它来代替lambda,但我不知道如何解决其中的依赖关系。
实现这一目标的正确方法是什么?
不确定UseCustomMiddleware
是什么,但您不需要app.Services.CreateScope().ServiceProvider...
(也不处理坏的作用域(。中间件应该可以访问HttpContext
,它具有RequestServices
属性,您应该使用它来解析服务。理论上,您可以尝试从HttpRequest
:获得它
app.UseCustomMiddleware<IContract,Methods>("/", async (httpRequest, accessibility, message, ...) =>
{
var authenticationService = httpRequest.HttpContext.RequestServices.GetRequiredService<AuthenticationService>();
});
另请参阅文档中的示例,尤其是提取到类中的中间件,我认为它们更适合复杂逻辑,而不是具有Func
处理程序的逻辑。