微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在没有ServiceProvider的情况下获取AuthorizationHandler的实例

如何解决在没有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());
    });

但是当ITestServiceAddScoped注册时失败。

有趣的是,使用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 举报,一经查实,本站将立刻删除。