Asp.net Core options类需要类实例作为参数,如果类使用DI引用怎么办?



在startup.cs中我有

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(new SomeRequirement()));
});

如果somerrequirement类需要一个只能通过依赖注入获得的类,就像下面这样。我不能/不想实例化某个需求

public class SomeRequirement : AuthorizationHandler<SomeRequirement>, IAuthorizationRequirement
{
    ISomething _something;
    public SomeRequirement(ISomething something)
    {
        _something = something;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SomeRequirement requirement)
    {
        //TODO Do stuff
        return Task.CompletedTask;
    }
}

我建议有两种解决方案。

  1. 我假设你有ISomething的具体实现。如果你知道那初始化它并把它作为参数传递给parameter。

  2. 第二个解决方案有点尴尬。

    • ASP.net Core中默认的DI容器不支持属性注入。

    • 不要使用默认的DI容器,尝试使用Autofac或其他支持属性注入的DI容器

更新1:可能的解决方案。(使用ASP.net Core的默认DI)

public class SomeRequirement : AuthorizationHandler<SomeRequirement>, IAuthorizationRequirement
{
    ISomething _something;
    public SomeRequirement(ISomething something)
    {
        _something = something;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SomeRequirement requirement)
    {
        //TODO Do stuff
        return Task.CompletedTask;
    }
}
public interface ISomething
{
}
public class Something : ISomething
{
}

And In ConfigureService

services.AddSingleton<ISomething, Something>();
services.AddScoped(typeof(SomeRequirement));
services.AddAuthorization(options =>
            {                
options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(services.BuildServiceProvider().GetRequiredService<SomeRequirement>()));
            });

相关内容

最新更新