Мне нужно внедрить некоторые службы с внедрением зависимостей в фильтры действий. Я знаком с подходом [ServiceFilter] и [TypeFilter], но он некрасивый, беспорядочный и непонятный.

Есть ли способ установить фильтр обычным способом? без упаковки фильтра, который я использую с [ServiceFilter] или [TypeFilter]?

Например, что я хочу:

[SomeFilterWithDI]
[AnotherFilterWithDI("some value")]
public IActionResult Index()
{
    return View("Index");
}

Вместо того:

[ServiceFilter(typeof(SomeFilterWithDI))]
[TypeFilter(typeof(AnotherFilterWithDI), Arguments = new string[] { "some value" })]
public IActionResult Index()
{
    return View("Index");
}

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

5
O. Shai 28 Ноя 2018 в 02:28

1 ответ

Лучший ответ

По поводу [SomeFilterWithDI] вы можете сослаться на комментарий @Kirk larkin.

Для [AnotherFilterWithDI("some value")] вы можете попробовать передать Arguments от TypeFilterAttribute.

  • ParameterTypeFilter определяют параметры приема.

    public class ParameterTypeFilter: TypeFilterAttribute
    {
    
        public ParameterTypeFilter(string para1, string para2):base(typeof(ParameterActionFilter))
        {
            Arguments = new object[] { para1, para2 };
        }
    }
    
  • ParameterActionFilter принимают переданные параметры.

        public class ParameterActionFilter : IActionFilter
    {
        private readonly ILogger _logger;
        private readonly string _para1;
        private readonly string _para2;
    
        public ParameterActionFilter(ILoggerFactory loggerFactory, string para1, string para2)
        {
            _logger = loggerFactory.CreateLogger<ParameterTypeFilter>();
            _para1 = para1;
            _para2 = para2;
        }
    
        public void OnActionExecuting(ActionExecutingContext context)
        {
            _logger.LogInformation($"Parameter One is {_para1}");
            // perform some business logic work
    
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // perform some business logic work
            _logger.LogInformation($"Parameter Two is {_para2}");
        }
    }
    

    Согласно описанию из Arguments, ILoggerFactory loggerFactory разрешается с помощью dependency injection container. para1 и para2 разрешается ParameterTypeFilter.

        //
    // Summary:
    //     Gets or sets the non-service arguments to pass to the Microsoft.AspNetCore.Mvc.TypeFilterAttribute.ImplementationType
    //     constructor.
    //
    // Remarks:
    //     Service arguments are found in the dependency injection container i.e. this filter
    //     supports constructor injection in addition to passing the given Microsoft.AspNetCore.Mvc.TypeFilterAttribute.Arguments.
    public object[] Arguments { get; set; }
    
  • Использование

    [ParameterTypeFilter("T1","T2")]
    public ActionResult Parameter()
    {
        return Ok("Test");
    }
    
6
Edward 29 Ноя 2018 в 07:46