Фильтры с DI в ASP.NET Core

241
03 сентября 2018, 12:20

В чем отличие ServiceFilterAttribute от TypeFilterAttribute? Ну кроме того что второй не надо регистрировать в контейнере. И где какой использовать?

Answer 1

ServiceFilterAttribute

Класс ServiceFilterAttribute извлекает экземпляр фильтра напрямую из DI.

Особенности:

  • Необходимо регистрировать фильтры в Startup классе;

  • За счет использования ServiceProvider, мы можем задавать жизненный цикл для экземпляра фильтра. Например, services.AddSingleton<SomeFilter>(); позволит создать экземпляр фильтра один раз и использовать его на протяжении работы приложения. Это даст небольшой прирост в производительности.

TypeFilterAttribute

Класс TypeFilterAttribute создает экземпляр фильтра с помощью фабрики Microsoft.Extensions.DependencyInjection.ObjectFactory.

Особенности:

  • Не нужно регистрировать фильтры в Startup классе;
  • Экземпляр фильтра создается каждый раз при запросе;
  • Можно передавать кастомные параметры в конструктор фильтра с помощью свойства Arguments.

Например, вот такой фильтр:

public class AgeFilterAttribute : Attribute, IActionFilter
{
    public AgeFilterAttribute(int age, ILogger logger)
    {
    }
}

Можно использовать вот так:

public class AlcoController : Controller
{
    [TypeFilter(typeof(AgeFilterAttribute), Arguments = new object[]{ 18 })]
    public IActionResult Beer()
    {
        return View();
    }
    [TypeFilter(typeof(AgeFilterAttribute), Arguments = new object[]{ 21 })]
    public IActionResult Vodka()
    {
        return View();
    }
}

Мораль: если не нужны параметры в конструкторе, используй ServiceFilterAttribute с правильно указанным жизненным циклом при регистрации в Startup классе.

READ ALSO
Разветвление сайта

Разветвление сайта

Представьте ситуацию, когда при входе на сайт выдается модальное окно и спрашивает вы хотите перейти на сайт кока кола или пепси? При клике...

258
Чтение файла по частям

Чтение файла по частям

Есть вот такой метод, который читает по частям файл

232
Unity: проблема управления через джойстик

Unity: проблема управления через джойстик

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

253
Передача объекта в метод

Передача объекта в метод

Вопрос из серии "данет" и "дубликат, гуглить не умеешь"

230