Как предоставить базовые классы для требований авторизации?

У меня есть несколько типов требований авторизации, которые очень похожи. Первый тип занимает 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>();

Можно ли спроектировать это таким образом, чтобы сохранить этот СУХОЙ?

0 ответов

Другие вопросы по тегам