Olá Jefferson! Bom dia.
Entendo sua dúvida em relação ao controller estar realizando muitas responsabilidades além da gestão da requisição e resposta. É uma boa prática separar as responsabilidades em diferentes classes, como um service, para manter o código mais organizado e seguindo o princípio de responsabilidade única.
Para resolver esse problema, você pode criar uma classe separada, como um service, para realizar a filtragem e verificação de dados. Dessa forma, o controller ficará responsável apenas pela gestão da requisição e resposta.
Quanto à sua pergunta sobre onde o controller é instanciado ou chamado, geralmente isso é feito no arquivo Startup.cs, no método ConfigureServices. Nesse método, é possível configurar a injeção de dependência e definir as classes que serão utilizadas pelo controller.
Por exemplo, suponha que você tenha uma classe UserService que realiza operações relacionadas a usuários. Você pode configurar a injeção de dependência no Startup.cs da seguinte forma:
services.AddScoped<IUserService, UserService>();
Dessa forma, o controller poderá receber uma instância de IUserService no construtor e utilizar os métodos dessa classe para realizar as operações necessárias.
Espero ter ajudado e bons estudos!