在startup.cs中我有
services.AddAuthorization(options =>
{
options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(new SomeRequirement()));
});
如果SomeRequirement -class需要一个只能通过依赖注入获得的类,如下所示。我不能/不想实例化SomeRequirement。
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;
}
}
答案 0 :(得分:0)
我建议有两种解决办法。
我假设您具有ISomething
的具体实现。如果您知道初始化并将其作为参数传递给参数。这是一个简短而又甜蜜的解决方案。
第二种解决方案有点尴尬。
ASP.net Core中可用的默认DI容器不支持属性注入。
尝试使用Autofac或其他支持属性注入的DI容器,而不是使用默认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
{
}
在ConfigureService中
services.AddSingleton<ISomething, Something>();
services.AddScoped(typeof(SomeRequirement));
services.AddAuthorization(options =>
{
options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(services.BuildServiceProvider().GetRequiredService<SomeRequirement>()));
});