.NET

22 dez, 2017

ASP .NET Core – Injetando dependências nas Views

Publicidade

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>

Onde :

  1. @inject – é a diretiva usada para injetar dependências;
  2. <serviço> – é a classe de serviço;
  3. <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:

  1. Transient: Criado a cada vez que são solicitados;
  2. Scoped: Criado uma vez por solicitação;
  3. 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.