.net core 正在获取没有ServiceProvider的AuthorizationHandler实例
在dotnet core 3.1 Web API中,我定义了一个自定义授权处理程序。 在.net core 正在获取没有ServiceProvider的AuthorizationHandler实例,.net-core,dependency-injection,asp.net-core-webapi,.net Core,Dependency Injection,Asp.net Core Webapi,在dotnet core 3.1 Web API中,我定义了一个自定义授权处理程序。 在ConfigureServices中注册处理程序的代码通常如下所示: services.AddAuthorization(options => { options.AddPolicy("ValidCustomer", policy => policy.Requirements.Add(new ValidCustomerRe
ConfigureServices
中注册处理程序的代码通常如下所示:
services.AddAuthorization(options =>
{
options.AddPolicy("ValidCustomer",
policy => policy.Requirements.Add(new ValidCustomerRequirement()));
});
services.AddScoped<ValidCustomerRequirement>();
services.AddAuthorization((options, serviceProvider) =>
{
var validCustomerRequirement = serviceProvider.GetRequiredService<ValidCustomerRequirement>();
options.AddPolicy("ValidCustomer", policy => policy.Requirements.Add(validCustomerRequirement));
});
但是我的ValidCustomerRequirement
-处理程序使用构造函数注入。因此依赖注入应该创建实例。因此,我使用这些行进行注册:
services.AddScoped<ValidCustomerRequirement>();
services.AddAuthorization(options =>
{
var serviceProvider = services.BuildServiceProvider();
options.AddPolicy("ValidCustomer",
policy => policy.Requirements.Add(serviceProvider.GetService<ValidCustomerRequirement>()));
});
尽管它在启动时抛出异常。
无法从根提供程序解析作用域服务“ValidCustomerRequirement”。
玩了一会儿,我发现了以下几点:
public interface ITestService
{
string GetAnswer();
}
public class TestService : ITestService
{
public string GetAnswer() => "42";
}
它使用单例(只要构造函数参数中没有要创建的作用域实例)
调试时,我可以看到,sp
是
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope
而sp2
为
Microsoft.Extensions.DependencyInjection.ServiceProvider
看看我在这里给出的答案谢谢你的链接,Nkosi!尽管仍然存在问题:无法从根提供程序解析“icCustomerService”,因为它需要作用域服务“DbContext”
用您所做的更新帖子并包含新问题。
services.AddSingleton<ITestService, TestService>();
services.AddAuthorization((options, sp) =>
{
var testService = sp.GetService<ITestService>();
Console.WriteLine(testService.GetAnswer());
});
services.AddScoped<ITestService, TestService>();
services.AddAuthorization((options, sp) =>
{
var testService = sp.GetService<ITestService>(); // fails
var sp2 = services.BuildServiceProvider();
var testService2 = sp2.GetService<ITestService>(); // works
});