如何提供授权要求的基类?

时间:2019-08-21 21:46:53

标签: c# asp.net-core dependency-injection .net-core .net-core-authorization

我有一些非常相似的授权需求类型。第一种类型使用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?

0 个答案:

没有答案