ASP .NET Core - Atributo [FromServices]


 Hoje veremos a atribuições do atributo [FromServices] na ASP .NET Core, agora na versão 3.1.

A ASP.NET Core possui suporte embutido para a injeção de dependência(DI) para adicionar a dependência ao contêiner e consumi-la em sua aplicãção.

Realizar a injeção via construtor é a forma mais usada para injetar dependências na ASP .NET Core. No entanto, pode não ser a escolha ideal em determinadas situações, quando por exemplo, apenas um método Action no controlador requerer a dependência.

Neste cenário a ASP.NET Core fornece um atributo chamado FromServices que permite injetar as dependências diretamente no método Action do controlador que requer a dependência.

Usando o atributo [FromServices]

O Model Binding da ASP .NET Core permite a configuração usando atributos para indicar a fonte dos dados ou mesmo se desejamos que a vinculação de dados ocorra ou não. Dentre os atributos que podemos usar temos o atributo [FromServices] que sobrescreve a fonte de associação injetando os valores via injeção de dependência em um método Action específico.

Para fazer isso funciona basta adicionar o atributo ao método Action desejado, com a ASP .NET Core vai buscar de forma automática nas dependências as implementações e vai fazer injeção da dependência.

A seguir veremos um exemplo prático de como usar esse recurso.

Recursos :

Criando o projeto no VS 2019 Community

Abra o VS 2019 Community e crie uma solução em branco via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome Aspnet_ApiFromServices;

A seguir selecione .NET Core e ASP .NET Core 3.1 e marque o template API e as configurações conforme figura abaixo:

Clique no botão Create para criar o projeto que deverá ter a seguinte estrutrua:

Temos o controlador WeatherForecastController na pasta Controllers e o arquivo WeatherForecast.cs com os dados usados. Executando o projeto teremos o seguinte resultado:

Esse é o resultado da execução do método Get do controlador:

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }

Vamos agora criar um serviço neste projeto definindo uma interface e a sua implementação.

Para isso crie uma pasta Services no projeto e nesta pasta crie a interface IMeuServico com o código abaixo:

    public interface IMeuServico
    {
        string Saudacao(string nome);
    }

A seguir crie na mesma pasta a classe MeuServico que implementa a interface acima:

    public class MeuServico : IMeuServico
    {
        public string Saudacao(string nome)
        {
            return $"Bem-Vindo, {nome} \n\n{DateTime.Now}";
        }
    }

Implementamos o método Saudacao que recebe uma string e exibe a mensagem de saudação e a data.

Agora precisamos registrar o serviço no método ConfigureServices da classe Startup:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IMeuServico, MeuServico>();
            services.AddControllers();
        }

Registramos o serviço usando o tempo de vida AddTransient que é usado para mapear tipos abstratos para serviços concretos que são criados cada vez que são solicitados.

Agora para usar a injeção de dependência via atributo [FromServices] vamos definir um novo método HttpGet no controlador :

 [HttpGet("{nome}")]
 public ActionResult<string> GetSaudacao([FromServices] IMeuServico meuServico, string nome)
 {
       return meuServico.Saudacao(nome);
 }

Criamos o método Action GetSaudacao que recebe um parâmetro {nome} e usando o atributo [FromServices] injetamos uma instância do nosso serviço do tipo IMeuServico.

A seguir usando a instância do serviço e o método Saudacao, com o nome recebido exibimos a mensagem a partir da Url :  http:localhost:44311/weatherforecast/<nome>

Portanto, quando decoramos o método Action com o atributo FromServices, o framework pesquisará o contêiner de serviços e injetará a implementação correspondente.

Aqui não é necessário fazer injeção via construtor pois somente este método Action vai usar esse serviço.

Pegue o projeto aqui: Aspnet_ApiFromServices.zip

"Portanto, agora nenhuma condenação há para os que estão em Cristo Jesus, que não andam segundo a carne, mas segundo o Espírito."
Romanos 8:1

Referências:


José Carlos Macoratti