解析<T>移动到单独类文件的 Func 中的依赖项



我正在使用一个代码库(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处理程序的逻辑。

最新更新