Asp.net Внедрение основных зависимостей в фильтры без [ServiceFilter] или [TypeFilter] - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно внедрить некоторые сервисы с внедрением зависимостей в фильтры действий.Я знаком с подходом [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");
}

Это выглядит по-другому, этот подход мне не кажется правильным.

1 Ответ

0 голосов
/ 29 ноября 2018

Для [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");
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...