在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;
}
}
我建议有两种解决方案。
-
我假设你有
ISomething
的具体实现。如果你知道那初始化它并把它作为参数传递给parameter。 -
第二个解决方案有点尴尬。
-
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>()));
});