aspnet core mvc - доступ к службам, зависимым от зависимостей, внутри ActionFilterAttribute - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь получить доступ к следующей службе в ActionFilterAttribute.

IFooService Служба

 public interface IFooService<T>
 {
     List<T> GetFoos { get; set; }
 }

Реализация * FooService **

public class FooService : IFooService<int>
{
    public List<int> GetFoos()
    {
       //do something interesting here.
           return new List<int>();
    }
}

Указанный выше сервис зарегистрирован в контейнере зависимостей aspnetcore как:

services.AddScoped<IFooService<int>, FooService>();

Я хочу использовать IFooService внутри моего атрибута.Однако на уровне атрибута я не знаю параметр типа.

возможно ли найти вышеуказанный сервис внутри ActionFilterAttribute, не зная параметра типа?Я хочу иметь возможность вызывать метод GetFoos только на интерфейсе.

// вот моя попытка.

 public class FooActionFilter : ActionFilterAttribute
 {
      public override void OnActionExecuted(ActionExecutedContext context)
      {
            //error here generic service require 1 argument. But i don't know how to pass this argument..
            var foo = (IFooService) context.HttpContext.RequestServices.GetService(typeof(IFooService<>));                                    
      }
 }

1 Ответ

0 голосов
/ 28 мая 2018

Вы можете сохранить тип в фильтре действий в качестве параметра.

[AttributeUsage(AttributeTargets.Method)]
public class FooActionFilterAttribute : ActionFilterAttribute
{
    public FooActionFilterAttribute(Type serviceType)
    {
        ServiceType = serviceType;
    }

    public Type ServiceType { get; }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var service =  context.HttpContext.RequestServices.GetService(ServiceType) as FooService;                   
    }
}

// usage
[FooActionFilter(typeof(IFilterService<int>))]
public IActionResult ActionMethod()
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...