В чем отличие ServiceFilterAttribute от TypeFilterAttribute? Ну кроме того что второй не надо регистрировать в контейнере. И где какой использовать?
Класс ServiceFilterAttribute извлекает экземпляр фильтра напрямую из DI.
Особенности:
Необходимо регистрировать фильтры в Startup классе;
За счет использования ServiceProvider, мы можем задавать жизненный
цикл для экземпляра фильтра. Например,
services.AddSingleton<SomeFilter>(); позволит создать экземпляр фильтра один раз и использовать его на протяжении работы приложения. Это даст небольшой прирост в производительности.
Класс 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 классе.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости