我有一些非常相似的授权需求类型。第一种类型使用string[]
个角色来检查用户的角色。第二种类型具有提升角色的string[]
可以使处理程序短路,而另一种string[]
可以像第一种那样检查角色。假设我有以下内容:
public abstract class RoleRequirement : IAuthorizationRequirement
{
internal string[] CheckedRoles { get; }
public RoleRequirement(string[] checkedRoles)
{
CheckedRoles = checkedRoles;
}
}
public abstract class ElevatedRoleRequirement : RoleRequirement
{
internal string[] ElevatedRoles { get; }
public ElevatedRoleRequirement(string[] elevatedRoles, string[] checkedRoles)
: base(checkedRoles)
{
ElevatedRoles = elevatedRoles;
}
}
我对这两种类型都有一些具体的变化,并且相关的处理程序接受这些具体的类型。问题是DI会将它们全部解析为基础RoleRequirement
,即使传递给处理程序的实际类型是具体类型。这将导致调用错误的处理程序,而该处理程序无法处理给定的类型。
我尝试将处理程序注册为单例并且没有作用域,尽管我很可能需要作用域处理程序。每个外观如下:
services.AddSingleton<IAuthorizationHandler, SomeRoleRequirementHandler>();
services.AddSingleton<IAuthorizationHandler, SomeElevatedRoleRequirementHandler>();
是否可以通过设计来保持此DRY?