quarta-feira, 28 de fevereiro de 2018

ASP.NET Core Web API - Utilizando Injeção de Dependência


A proposta desse tutorial é apresentar, de forma prática, como criar uma aplicação .Net Core Web API, utilizando injeção de dependência.

Antes de começarmos o projeto, vamos pontuar algumas facilidades da estrutura Web API:


  • Framework de serviços HTTP de implementação fácil e prática;
  • Utiliza a arquitetura REST (sigla em inglês para: Representational State Transfer), onde as solicitações HTTP utilizam o mesmo endereço de URL;
  • As requisições utilizadas para esse serviço são chamadas de método HTTP ou verbo, sendo: GET, POST, PUT, DELETE, TRACE, OPTIONS, PATCH, CONNECT, HEAD.
    Os mais utilizados são: 
    GET, POST, PUT, DELETE (o Visual Studio já implementa essas chamadas através do projeto: Aplicativo Web ASP.NET Core - Web API);
  • Aplicações mobile, web e serviços podem consumir as chamadas de Web API;
  • As respostas  das chamadas são no formato MediaTypeFormatter e os mais utilizados são: JSON e XML.

Vamos para a parte prática: abra o Visual Studio 2017 e escolha o Aplicativo Web ASP.NET Core:


Na próxima tela, escolha o aplicativo API Web:



O projeto foi criado e notamos que na pasta Controller  a classe ValuesController.cs, já implementa os quatro métodos HTTP mais utilizados.

O próximo passo é a implementação da classe Usuário. Para isso, crie uma pasta chamada Models e depois crie a classe Usuario.cs , conforme modelo abaixo:



Vamos criar o Repositório. Crie uma pasta com esse nome, após isso crie a interface IUserRepositorio.cs  e implemente o seguinte código:

Em seguida, vamos criar a classe UserRepositorio.cs e implemente o código abaixo:






Feito isso, vamos implementar esses métodos na classe ValuesController.cs, seguindo os passos abaixo:




Antes de prosseguirmos, note que antes das chamadas HTTP, foi implementado a referência para o uso da interface IUserRepositorio:

Se você tentar executar essa aplicação, gerará um erro, pois precisamos referenciar essa injeção de dependência na classe Startup.cs - no método ConfigureServices, conforme código abaixo:



Temos dois pontos importantes nessa implementação:

  1. A referência para a injeção de dependência foi feita no método ConfigureServices, que é responsável pelos serviços utilizados pela aplicação;
  2. O serviço utilizado para referenciar a interface foi o AddSingleton().
    Vale ressaltar que existem três tipos de serviços:

    - AddScoped():    Compartilhado em uma única solicitação, ou escopo de serviço.
    - AddTransient(): Criado em cada solicitação para o serviço.
    - AddSingleton(): Uma única instância compartilhada ao longo da vida útil do
                              aplicativo.
Pronto, agora é só executar a aplicação e, como exemplo, teremos o retorno para a chamada GET():


O projeto está disponível no meu GitHub


terça-feira, 27 de fevereiro de 2018

Entity Framework Core 2.1 Preview 1 - Overview


Entity Framework Core 2.1 Preview 1 - Overview


A Microsoft lançou hoje, uma prévia Entity Framework Core 2.1. 

Esses pacotes encontram-se disponíveis no NuGet, onde é possível instalar o pacote Microsoft.EntityFrameworkCore - v2.1.0-preview2-final, bem como os pacotes individuais dessa biblioteca.



Antes de realizar a instalação, é importante verificar qual o banco de dados o projeto em questão está utilizando.

Para os bancos de dados SQL Server, SQLite ou In-Memory, a instalação poderá ser feita diretamente pelo NuGet ou, então, pela linha de comando abaixo:

$ dotnet add package Microsoft.EntityFrameworkCore.SqlServer -V 2.1.0-preview1-final

Através NuGet:


Para outros provedores de dados relacionais - compatíveis com o EF Core 2.0, a instalação também está disponível no NuGet ou, então, pela linha de comando abaixo:

$ dotnet add package Microsoft.EntityFrameworkCore.Relational -V 2.1.0-preview1-final

Através NuGet:

Novas features


  • Lazy loading: Através do EF Core é possível a construção de blocos necessários para qualquer pessoa autorizar classes de entidades que possam carregar suas propriedades de navegação sob demanda.
    Um novo pacote foi criado para alavancar esses pacotes: Microsoft.EntityFrameworkCore.Proxies

  • Parameters in entity constructors: Como um dos blocos de construção necessários para o carregamento lento, habilitamos a criação de entidades que tomam parâmetros em seus construtores.
    É possível injetar valores de propriedades, lazy loading delegates e serviços.
  • Value Conversions: As conversões de valores podem ser aplicadas para transformar os valores obtidos das colunas antes de serem aplicadas nas propriedades e vice-versa.
    Há uma série de conversões que podem ser aplicadas por convenção, bem como uma API de configuração, que permite registrar conversões personalizadas entre colunas e propriedades. Algumas das aplicações deste recurso são:
                      - Armazenamento de enums e strings;
                      - Mapeamento de inteiros não assinados com o SQL Server;
                      - Criptografia e decodificação automática de valores de
                         propriedade;
  • LINQ GroupBy translation: Antes da versão 2.1, no EF Core, o operador GroupBy LINQ era avaliado na memória. Agora há suporte a tradução para esse operador nos casos mais comuns.
    No exemplo abaixo, a consulta utiliza a cláusula GroupBy para calcular várias funções agragadas:

    var query = context.Orders .GroupBy(o => new { o.CustomerId, o.EmployeeId }) .Select(g => new { g.Key.CustomerId, g.Key.EmployeeId, Sum = g.Sum(o => o.Amount), Min = g.Min(o => o.Amount), Max = g.Max(o => o.Amount), Avg = g.Average(o => Amount) });

    Traduzindo para SQL, entende-se dessa forma:

    SELECT[o].[CustomerId], [o].[EmployeeId], SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount]) FROM [Orders] AS [o] GROUP BY [o].[CustomerId], [o].[EmployeeId];
  • Data Seeding: Nessa nova versão, será possível fornecer dados iniciais para preencher um banco de dados.
    No exemplo abaixo, é possível configurar o data seed pra o Post in
    OnModelCreating:

    modelBuilder.Entity<Post>().SeedData(new Post{ Id = 1, Text = "Hello World!" });

    Para mais informações sobre Data Seeding, acesse esse link
  • Query types: Agora o EF Core Model inclui a query types. Ao contrário dos tipos de entidade, os tipos de consulta não possuem chaves definidas neles e não podem ser inseridas, excluídas ou atualizadas (usada apenas para leitura), mas elas podem ser retornadas diretamente por consultadas.
    Alguns dos cenários de uso para tipos de consulta são:

                    - Mapeamento para modos de exibição sem chaves primárias;
                    - Mapeamento para tabelas sem chaves primárias;
                    - Mapeamento para consultas definidas na model;
                    - Servindo como o tipo de retorno para consultas FromSQL().
  • Include for derived types: Agora será possível especificar propriedades de navegação apenas definidas em tipos derivados ao escrever expressões para o método Include. Há suporte de referências dos nomes da propriedade de navegação definida em tipos derivados para o Include:

    var option1 = context.People.Include(p => ((Student)p).School); var option2 = context.People.Include(p => (p as Student).School); var option3 = context.People.Include("School");

  • System.Transactions support: É possível trabalhar com os recursos do System.Transactions, por exemplo: TransactionScope.
    Funcionará para o .NET Framework quanto para o .NET Core, ao usar os provedores de banco de dados que o suportam.
  • Better column ordering in initial migration: Atualização das migrações para inicialmente gerar colunas para tabelas na mesma ordem em que as propriedades são declaradas nas classes.
    O EF Core não pode alterar a ordem quando novos membros são adicionados após a criação da tabela inicial.
  • Optimization of correlated subqueries: Melhora na tradução de consultas para evitar a execução de consultas SQL "N + 1" em muitos cenários comuns em que o uso de uma propriedade de navegação leva a juntar dados da consulta raiz com dados de uma subconsulta correlacionada.
  • OwnedAttribute: Agora é possível configurar os tipos de entidades da propriedade simplesmente anotando o tipo com [Owned] e depois validar que a entidade será adicionada na Model.O pacote responsável por essa definição é Microsoft.EntityFrameworkCore.Attributes, veja exemplo:

    [Owned]
    public class StreetAddress { public string Street { get; set; } public string City { get; set; } } public class Order { public int Id { get; set; } public StreetAddress ShippingAddress { get; set; } }
     


 Para maiores informações, acesse: Announcing Entity Framework Core 2.1 Preview 1


Até mais.