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.

segunda-feira, 15 de agosto de 2016

Implementando requisição HTTP utilizando CORS (Cross-Origin Resource Sharing) - C#



Antes de começarmos a implementar um exemplo de requisição HTTP CORS, vamos entender um pouco sobre esse conceito.

CORS (compartilhamento de recursos de origem cruzada), permite que os recursos de uma aplicação sejam acessados por um domínio diferente, ou seja, este mecanismo permite a transferência de dados entre domínios de forma segura.

Isso acontece porque os navegadores - por questão de segurança, permitem apenas que os recursos de uma aplicação sejam consumidos pelo seu próprio domínio.

Para que este compartilhamento ocorra, precisamos definir novos cabeçalhos HTTP, permitindo que outro domínio consuma os nossos recursos.

Neste exemplo, vamos trabalhar com o método POST, porém são permitidos ainda os métodos GET e HEAD.

A ideia é disponibilizar um recurso para Upload de arquivos.

Primeiramente, vamos definir os cabeçalhos que permitirão o compartilhamento do nosso recurso:

1) "Access-Control-Allow-Headers": Define quais cabeçalhos HTTP poderão realizar a solicitação;
2) "Access-Control-Allow-Origin": Define qual será o domínio que consumirá este recurso;
3) "Access-Control-Allow-Methods": Define o método HTTP que será utilizado.

Este cabeçalho é enviado na requisição chamada "OPTIONS", que será consumida antes dos métodos POST, GET e HEAD.

Muito bem, chegou a hora de programarmos:

1) Crie uma nova aplicação do tipo Asp.NET Web Application e vamos chama-la de: ExemploCors




 2) Defina este projeto do tipo WebAPI - Empty




3) No projeto, adicione uma nova pasta com o nome Modulo




4) Na pasta Modulo, crie uma classe com o nome HeaderOptions e implemente o seguinte código:

Importante: No cabeçalho: "Access-Control-Allow-Origin", "http://dominio.com.br" , não esqueça de alterar para a URL do parceiro que irá consumir a sua aplicação.


5) Na pasta Controllers, crie um novo controle do tipo Web API 2 Controller - Empty e defina o nome para CorsController




6) Precisamos adicionar a referência System.Web.Http.Cors,  para isto, clique em References e com o botão esquerdo escolha Manage NuGet Packages




No campo busca, digite: Cors
Após o resultado da busca, escolha a opção: Microsoft ASP.NET Web API Cross-Origin Support , clique em Install.



7) Implemente o código abaixo:

Importante: Note que habilitamos novamente o cabeçalho HTTP Cors na chamada [HttpPost], não esqueça de alterar a configuração origins: "http://dominio.com.br" , para a URL do parceiro que irá consumir a sua aplicação.




8) No arquivo Web.config, precisamos referenciar o módulo HeaderOptions dentro da referência:  <system.webServer>




9) Para finalizar, no arquivo App_Start/WebApiConfig.cs, inclua o código abaixo:

config.EnableCors();




Agora chegou a hora de testar. Vamos utilizar o Postman para isso.

OBS.: Postman donwload: https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop


No Visual Studio, clique no menu DEBUG, escolha a opção Start Debugging.



Após isso, vamos para o Postman, e siga a configuração abaixo:






Fonte de pesquisa: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
                                https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing












terça-feira, 26 de julho de 2016

JSON JavaScriptSerializer- Erro durante a Serialização dos dados





O objetivo deste post é mostrar de forma prática e rápida, como alterar o tamanho do caracteres para serialização dos dados, utilizando a biblioteca JavaScriptSerializer.

Primeiramente, o namespace   System.Web.Script.Serialization, possui, entre outras, a propriedade: MaxJsonLength, responsável em determinar o comprimento máximo de cadeias de caracteres JSON.
Por padrão, o Serialization definido é de 2097152.




Acontece que dependendo do tamanho do objeto a ser serializado, precisamos alterar esta propriedade.

Veja o erro que pode ocorrer durante este processo:





Isto é simples, basta alterar esta propriedade. No caso, alteramos para o valor de: 86753090, veja o código:


            var serializer = new JavaScriptSerializer();
            serializer.MaxJsonLength = 86753090;






Até a próxima.






































segunda-feira, 25 de julho de 2016

SQL Server - Retonar extensão do nome do arquivo - Funções: LEN, CHARINDEX, Right



A proposta do script abaixo é retornar a extensão do arquivo - via Banco de Dados.

Primeiramente, vamos entender as funções utilizadas no script:

1) Função LEN: Retorna o número de caracteres da expressão da cadeia de caracteres especificada, excluindo espaços em branco à direita.
(fonte: https://msdn.microsoft.com/pt-br/library/ms190329.aspx?f=255&MSPPError=-2147217396)


2) Função CHARINDEX: Pesquisa uma expressão para outra e retorna sua posição inicial, se for localizada. 
(fonte: https://msdn.microsoft.com/pt-br/library/ms186323.aspx)

3) Função Right: Retorna a parte da direita de uma cadeia de caracteres com o número de caracteres especificado 
(fonte: https://msdn.microsoft.com/pt-br/library/ms177532.aspx)


Para facilitar a compreensão, vamos separar as funções utilizadas e visualizar cada retorno:


select nomeArquivo  , LEN(nomeArquivo) as totalChar   , CHARINDEX('.', nomeArquivo) as posChar from arquivos
    

Muito bem, conseguimos retornar o nome, o total de caracteres e a posição deste dentro da coluna.


Agora vamos agregar estas funções e retornar qual é a extensão para cada nome do arquivo:

select nomeArquivo, right(nomeArquivo, LEN(nomeArquivo) - CHARINDEX('.', nomeArquivo)+1) as extensao from arquivos




Até a próxima.