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