in ASP.NET

ASP.NET MVC 6 – Inject (injetando um serviço em uma View)

Uma feature bem interessante do ASP.NET MVC 6 é que ele traz um container padrão para injeção de dependência(é possível alterar o container e configurar), entrarei em maiores detalhes sobre com funciona esta injeção de dependência em um próximo post. Neste post eu queria mostrar a possibilidade de injetar um serviço (uma classe) em uma View, e utilizar todos os recursos dela e do razor, incluindo async e await, para isto só precisaremos criar uma classe, registrar ela no injetor de dependência e utilizar um statement novo no razor, o “inject”  \o/


Injetando um serviço em uma view

Para começar este exemplo, criei um projeto ASP.NET 5 Stater Web no Visual Studio 2015 Preview.image

Após isto, vou modificar o context padrão  da aplicação, para incluir um DbSet de Inscrições, realizar as migrações, deixando ele da seguinte maneira:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Inscricao> Inscricoes { get; set; }

    //outros códigos
}

public class Inscricao
{
    public  int Id { get; set; }
    public  string Nome{ get; set; }
    public  string Email { get; set; }
}

 

Para adicionar uma migration precisarei abrir um console no diretório do projeto e utilizar o seguintes comandos:

k ef migration add <nome da migration>

k ef migration apply

Agora podemos desenvolver nossa classe de serviço, lembrando que usar ou não este recurso depende de como você está projetando sua aplicação.

using System;
using System.Linq;
using System.Threading.Tasks;
using WebApplication2.Models;

namespace WebApplication2.Service
{
    public class InscricaoService
    {
        public InscricaoService (ApplicationDbContext dbContext)
        {
            context = dbContext;
        }

        public async Task<int> GetTotal()
        {
            return await context.Inscricoes.CountAsync();
        }
        public async Task<Inscricao> GetUltimaInscricao()
        {
            return await context.Inscricoes.OrderByDescending(a=>a.Id).FirstOrDefaultAsync();
        }

        private ApplicationDbContext context;
    }
}

Com a nossa classe de serviço criada, vou registrar ela no Startup.cs, dentro do metodo chamado ConfigureService.

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        // Setup configuration sources.
        Configuration = new Configuration()
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();
    }

    public IConfiguration Configuration { get; set; }

    // This method gets called by the runtime.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add EF services to the services container.
        services.AddEntityFramework(Configuration)
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>();

        // Add Identity services to the services container.
        services.AddDefaultIdentity<ApplicationDbContext, ApplicationUser, IdentityRole>(Configuration);

        // Add MVC services to the services container.
        services.AddMvc();

        //configuração da injeção do serviço
        services.AddTransient<Service.InscricaoService>();
    }
}

O ultimo passo é utilizar o inject em nossas views, e realmente utilizar nosso serviço.

@inject WebApplication2.Service.InscricaoService InscricaoService

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>ASP.NET 5</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="http://asp.net/vnext" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
</div>

<div class="row">
    <div class="col-md-4">
        <h2>Inscritos @await InscricaoService.GetTotal()</h2>
        @{var ultimo = await InscricaoService.GetUltimaInscricao(); }
        <ul>
            <li>
                @if (ultimo != null)
                { 
                    @ultimo.Nome
                }
            </li>
            <li>Theming using <a href="http://go.microsoft.com/fwlink/?LinkID=398939">Bootstrap</a></li>
        </ul>
    </div>
</div>

Bom espero que este post seja útil, lembrando que a forma de utilizar esta feature varia muito de acordo com o padrão e a arquitetura de seu projeto. Além disto, o ASP.NET está em constante desenvolvimento, e pode ser que até a versão final deste novo release muita coisa mude. Porém acho muito importante estudar uma tecnologia e acompanhar seu desenvolvimento.

Estou a disposição para dúvida, criticas e sugestões.

abs

Rodolfo