Aspnetcore 3.1 внедрение зависимостей для фильтра - PullRequest
2 голосов
/ 05 марта 2020

В моем приложении netcore 3.1 есть фильтр:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class JwtAuthenticationAttribute : Attribute, IAuthorizationFilter
    {
        // Custom property
        public string Permission { get; set; } = "";

        private readonly AppSettings _appSettings;

        public JwtAuthenticationAttribute(IOptions<AppSettings> appSettings) : base()
        {
            _appSettings = appSettings.Value;
        }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            throw new NotImplementedException();
        }

 }

И мне пришлось реализовать Dependency Injection, потому что мне нужно получить IOptions в моем конструкторе.

Вкл. мой Startup.cs Мне просто нужно было сделать это:

  services.AddScoped<JwtAuthenticationAttribute>();

И затем добавить следующий атрибут в мой метод API:

[ServiceFilter(typeof(JwtAuthenticationAttribute))]

Это все работает, но если вы видите в подробно, у моего фильтра есть пользовательский параметр, который мне нужно передать, и на основании вышеуказанного атрибута я не могу его передать.

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

До DI я использовал:

 [JwtAuthentication(Permission = "Security.User.Update")]

Но вышеуказанный способ не может позволить мне получить инъекцию зависимости.

Любой подсказка?

1 Ответ

0 голосов
/ 05 марта 2020

Из-за особенностей использования этого атрибута анти-шаблон локатора службы должен использоваться в текущем контексте

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class JwtAuthenticationAttribute : Attribute, IAuthorizationFilter {
    // Custom property
    public string Permission { get; set; } = "";

    public void OnAuthorization(AuthorizationFilterContext context) {
        IServiceProvider services = context.HttpContext.RequestServices;

        AppSettings appSettings = services.GetService<IOptions<AppSettings>>().Value;

        //...
    }
}
...