Sobes.tech
Назад к вопросам
Junior — Middle
58

Чем отличаются межпоследовательные компоненты и фильтры в архитектуре приложений?

Компании, где спрашивали
ООО Клеркгрупп

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Интерсепторы и фильтры решают похожие задачи, но находятся на разных уровнях и обычно применяются в разных слоях приложения. Фильтры чаще работают внутри веб-пайплайна и обрабатывают запрос до и после выполнения action/handler. Интерсепторы обычно перехватывают вызовы на более общем уровне, например при работе с сетевыми клиентами, RPC или ORM.

Определение:

Фильтр — это компонент, который встраивается в конвейер обработки запроса и позволяет выполнить логику до основного действия, после него или при ошибке. В веб-приложениях фильтры часто используют для авторизации, логирования, валидации, кэширования и обработки исключений.

Интерсептор — это механизм перехвата вызова до его выполнения и/или после него, часто независимо от конкретного HTTP-пайплайна. Он применяется там, где нужно централизованно добавить поведение к вызовам сервиса, клиента или инфраструктурного компонента.

Главное отличие: фильтр обычно привязан к web/request pipeline, а интерсептор — к перехвату вызовов на более низком или общем уровне.

Пример использования:

Фильтр удобно использовать для проверки заголовка авторизации на входящем HTTP-запросе. Интерсептор удобно использовать, когда нужно автоматически добавить токен ко всем исходящим HTTP-запросам или залогировать все вызовы к удалённому сервису.

// Пример идеи для ASP.NET-подобного фильтра
public class AuthFilter
{
    public void OnActionExecuting()
    {
        // Проверка прав доступа до выполнения контроллера
    }

    public void OnActionExecuted()
    {
        // Логика после выполнения действия
    }
}

// Пример идеи для интерсептора исходящих вызовов
public class LoggingInterceptor
{
    public void BeforeCall(string methodName)
    {
        // Логирование перед вызовом
    }

    public void AfterCall(string methodName)
    {
        // Логирование после вызова
    }
}

Пояснение кода:

В примере фильтр показывает два момента обработки: до выполнения действия и после него. Это типичный сценарий для веб-приложения, где нужно проверить запрос, а затем при необходимости обработать результат.

Интерсептор в примере перехватывает обычный вызов метода: сначала выполняется код BeforeCall, затем сам вызов, затем AfterCall. Это демонстрирует идею перехвата без привязки к HTTP.

Код здесь иллюстративный: он показывает роль компонентов, а не конкретную реализацию фреймворка.

Ключевые моменты:

  • Фильтры чаще относятся к HTTP/web pipeline, интерсепторы — к перехвату вызовов в более широком смысле.
  • Фильтр обычно работает вокруг action/handler в рамках запроса.
  • Интерсептор чаще используется для инфраструктурных задач: логирование, метрики, ретраи, добавление заголовков, трассировка.
  • Фильтры удобны для сценариев на уровне контроллера или запроса; интерсепторы — для повторного использования логики вокруг вызовов сервисов.
  • В реальных проектах граница зависит от фреймворка: иногда терминология отличается, но идея перехвата и оборачивания вызова сохраняется.