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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
ASP .NET Core - Implementando a segurança com ... - Macoratti
ASP.NET Core MVC - Criando um Dashboard ... - Macoratti.net
ASP .NET Core - Apresentando Razor Pages - Macoratti
ASP .NET Core MVC - CRUD básico com ADO .NET - Macoratti
ASP .NET Core - Implementando e consumindo JWT - Macoratti
ASP .NET Core - Criando uma API CRUD - I - Macoratti.net
ASP .NET Core - Criando sua primeira Web API ... - Macoratti