如何解决在没有ServiceProvider的情况下获取AuthorizationHandler的实例
在dotnet核心3.1 Web API中,我定义了一个自定义AuthorizationHandler。
在ConfigureServices
中注册处理程序的代码通常如下所示:
services.AddAuthorization(options =>
{
options.AddPolicy("ValidCustomer",policy => policy.Requirements.Add(new ValidCustomerRequirement()));
});
但是我的ValidCustomerRequirement
处理程序使用构造函数注入。因此,依赖项注入应创建实例。因此,我正在使用这些行进行注册:
services.AddScoped<ValidCustomerRequirement>();
services.AddAuthorization(options =>
{
var serviceProvider = services.BuildServiceProvider();
options.AddPolicy("ValidCustomer",policy => policy.Requirements.Add(serviceProvider.GetService<ValidCustomerRequirement>()));
});
是否有一种更好的方法而不使用BuildServiceProvider()
?
更新
遵循Nkosis的建议,代码像这样优雅:
services.AddScoped<ValidCustomerRequirement>();
services.AddAuthorization((options,serviceProvider) =>
{
var validCustomerRequirement = serviceProvider.GetrequiredService<ValidCustomerRequirement>();
options.AddPolicy("ValidCustomer",policy => policy.Requirements.Add(validCustomerRequirement));
});
尽管在启动时会引发异常。
Cannot resolve scoped service 'ValidCustomerRequirement' from root provider.
玩了一点,我发现了以下内容:
public interface ITestService
{
string GetAnswer();
}
public class TestService : ITestService
{
public string GetAnswer() => "42";
}
它与Singleton一起使用(只要在构造函数参数中没有要创建作用域的实例)。
services.AddSingleton<ITestService,TestService>();
services.AddAuthorization((options,sp) =>
{
var testService = sp.GetService<ITestService>();
Console.WriteLine(testService.GetAnswer());
});
但是当ITestService
向AddScoped
注册时失败。
有趣的是,使用ServiceProvider
创建BuildServiceProvider()
时,它起作用。
services.AddScoped<ITestService,sp) =>
{
var testService = sp.GetService<ITestService>(); // fails
var sp2 = services.BuildServiceProvider();
var testService2 = sp2.GetService<ITestService>(); // works
});
调试时,我看到sp
是类型
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEnginescope
而sp2
是类型
Microsoft.Extensions.DependencyInjection.ServiceProvider
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。