考虑到参数必须是编译时常量,属性接受接口没有多大意义。
一种方法是您可以将接口注册为服务,并使用下面的代码获取它们,而无需构造函数注入。例如:
1.接口:
public interface IUserService
{
//..
}
public class UserService : IUserService
{
//..
}
2.启动时:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IUserService, UserService>();
}
3.自定义授权属性
public class HMACAuthenticationAttribute, IAsyncAuthorizationFilter
{
public HMACAuthenticationAttribute()
{
}
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
var user = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
}
}
Update:
另一种方法是你也可以使用[ServiceFilter]
or [TypeFilter]
通过DI,参考
https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#servicefilterattribute https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#servicefilterattribute
1.启动时,注册HMACAuthenticationAttribute
:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<HMACAuthenticationAttribute>();
services.AddSingleton<IUserService, UserService>();
}
2.自定义授权属性
public class HMACAuthenticationAttribute, IAsyncAuthorizationFilter
{
public HMACAuthenticationAttribute(IUserService user)
{
}
}
3.控制器
[ServiceFilter(typeof(HMACAuthenticationAttribute))]
public class WeatherForecastController : ControllerBase
{
}