Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 正在获取没有ServiceProvider的AuthorizationHandler实例_.net Core_Dependency Injection_Asp.net Core Webapi - Fatal编程技术网

.net core 正在获取没有ServiceProvider的AuthorizationHandler实例

.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

在dotnet core 3.1 Web API中,我定义了一个自定义授权处理程序。 在
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
    });