Инъекция зависимости локализатора без конструктора

2

Я создаю пользовательскую авторизацию в ядре .net. Все работает совершенно нормально, но я хочу добавить локализатор в ответ атрибута.

Ниже мой код

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class CustomAuthorizeFilters : AuthorizeAttribute, IAuthorizationFilter
    {
        public CustomAuthorizeFilters()
        { }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var User = context.HttpContext.User;

            if (!User.Identity.IsAuthenticated)
                return;

            using (var account_help = new AccountHelpers(Startup.ConnectionString))
            {
                var userId = Guid.Parse(new security.AesAlgoridhm().Decrypt(User.Claims.Where(x => x.Type == JwtRegisteredClaimNames.Sid)?.FirstOrDefault().Value));
                ProfileResponse user = new ProfileResponse();

                if (user == null)
                    context.Result = new CustomResultFilters("error_access_token_expired", 401);

                if (!user.EmailConfirmed)
                    context.Result = new CustomResultFilters("bad_response_account_not_confirmed", 400);

                if (!user.Active)
                    context.Result = new CustomResultFilters("bad_response_account_inactive", 400);
            }
        }
    }

Я попытался передать локализатор в конструктор, как это, но когда я передаю аргумент от контроллера, он выдает мне ошибку как

параметр конструктора атрибута имеет тип, который не является допустимым типом параметра атрибута

  IStringLocalizer<dynamic> localize { get; set; }
  public CustomAuthorizeFilters(IStringLocalizer<dynamic> localizer = null)
  {
            localize = localizer;
  }

Я знаю, что атрибут поддерживает только примитивные типы данных, поэтому я также попытался внедрить прямую зависимость как

context.HttpContext.RequestServices.GetService(typeof(IStringLocalizer<dynamic>));

но это дает ошибку, поскольку не может конвертировать из объекта в локализатор.

Любая помощь будет оценена.

  • 2
    Вы не можете использовать динамический в качестве параметра типа. Локализатор строки требует ТИПА . Тип используется для поиска файла ресурсов, содержащего переводы, т.е. IStringLocalizer<MyController> будет искать файл ресурсов с именем MyController.xx-yy.resx . Если вам нужен общий ресурс локализации, используйте фиксированный класс или фиктивный класс, такой как IStringLocalizer<SharedResources> где SharedResources - просто пустой класс. public class SharedResources { }
  • 3
    Также см. Документацию о том, как сделать внедрение зависимостей в атрибуты, используя атрибут ServiceFilter
Показать ещё 1 комментарий
Теги:
asp.net-core

1 ответ

-1

Как следует из сообщения об ошибке, вы не можете передать dynamic тип в качестве параметра атрибута. Как следует из этого ответа и согласно Microsoft, это допустимые типы параметров атрибута

  1. Простые типы (bool, byte, char, short, int, long, float и double)
  2. строка
  3. Тип системы
  4. перечислений
  5. object (Аргумент к параметру атрибута типа object должен быть постоянным значением одного из вышеуказанных типов.)
  6. Одномерные массивы любого из вышеперечисленных типов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню