Neste artigo, vou mostrar o novo recurso introduzido na ASP .NET Core que permite injetar dependências diretamente em uma View usando o container de injeção de dependência.
A ASP .NET Core introduziu um recurso chamado view injection que permite injetar dependências em uma view usando a palavra-chave inject.
Anteriormente, para recuperar os dados de uma View, precisávamos passá-lo a partir do Controlador usando as propriedades do Controlador, como ViewBag, ViewData ou propriedades do modelo.
Na ASP.NET Core MVC, essa tarefa ficou bem simples usando a diretiva Inject que permite injetar as dependências diretamente na View e recuperar os dados.
Vamos ver isso funcionando na prática!
Para acompanhar este artigo você precisa ter o Visual Studio Community 2017 com os seguintes workloads instalados:
Recursos usados: VS 2017 Community update 3 (no mínimo)
Criando o projeto ASP .NET Core no VS 2017
Abra no VS 2017 e no menu File clique em New Project. A seguir, selecione o template Visual C# -> Web e marque ASP .NET Core Web Application (.NET Core). Depois, informe o nome AspNetCore_ViewInject e clique em OK:
Na próxima janela, escolha a versão ASP .NET Core 1.1 e marque o template Web Application sem autenticação e clique no botão OK:
Teremos um projeto criado contendo as pastas e estrutura de arquivos prontas para ser o nosso ponto de partida.
Criando um novo serviço na aplicação
Vamos definir um serviço bem simples apenas para teste em nossa aplicação.
Crie a pasta Services no projeto ( Project -> New Folder) e, a seguir, inclua o arquivo TimesService.cs nesta pasta contendo o seguinte código:
using System.Collections.Generic; namespace AspNetCore_ViewInject.Services { public class TimesService { public List<string> GetTimes() { return new List<string>() { "Corintians", "Grêmio", "Santos", "Flamengo", "Palmeiras" }; } } }
Nesta classe, definimos o método GetTimes() que retorna uma coleção de times.
Injetando o serviço na View
Teremos, agora, como podemos injetar o serviço criado na view do projeto usando a diretiva @inject.
Pense na diretiva @Inject como uma propriedade que está sendo adicionada na sua View e preenchendo a propriedade usando a injeção de dependência.
A sintaxe básica usada é : @inject <serviço> <nome>
- @inject – é a diretiva usada para injetar dependências;
- <serviço> – é a classe de serviço;
- <nome> – é o nome da injeção do serviço pelo qual poderemos acessar os métodos do serviço.
Vamos abrir o arquivo Index.cshtml da pasta /Views/Home e incluir o código abaixo neste arquivo:
@inject AspNetCore_ViewInject.Services.TimesService ListaTimes <h1>Macoratti .net - View Injection </h1> <hr /> <h3>Lista de Times</h3> <ul> @foreach (var nome in ListaTimes.GetTimes()) { <li>@nome</li> } </ul>
Neste exemplo, estou injetando o serviço TimesService que será identificado pelo nome ListaTimes.
A seguir, usando um laço foreach, acesso o serviço e exibo os nomes de cada time da lista.
Só falta um detalhe para podermos usar o serviço. Temos que registrá-lo.
Registrando o serviço no arquivo Startup.cs
Abra o arquivo Startup.cs e inclua o código abaixo neste arquivo que registra o serviço criado para a injeção de dependência no método ConfigureServices.
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddTransient<TimesService>(); }
Na implementação da injeção de dependência do ASP.NET Core, vemos o conceito de lifetimes ou “tempo de vidas”. Um lifetime ou tempo de vida especifica quando um objeto DI-injetado é criado ou recriado. Existem três possibilidades:
- Transient: Criado a cada vez que são solicitados;
- Scoped: Criado uma vez por solicitação;
- Singleton: Criado na primeira vez que são solicitados. Cada solicitação subseqüente usa a instância que foi criada na primeira vez.
Executando o projeto, iremos obter o seguinte resultado:
Vemos, assim, o serviço injetado na view usando a diretiva @inject e os recursos de DI do container Asp .Net Core.