Aplicativos como IFood, Uber Eats, Google Places pegam a sua localização e mostram os locais próximos da sua posição, isto pode ser feito de forma simples e rápida usando .Net 6 + SQL Server + EF Core + NetTopologySuite
Aplicativos como IFood, Uber Eats, Google Places pegam a sua localização e mostram os locais próximos da sua posição, isto pode ser feito de forma simples e rápida usando .Net 6 + SQL Server + EF Core + NetTopologySuite | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hoje iremos desenvolver uma api que a partir da latitude e longitude passada irá listar os locais mais próximos e a distância entre a sua posição e o local. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Para este exemplo iremos usar: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Abra o Visual Studio e crie um novo projeto | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Selecione o projeto ASP.NET Core Web API e clique em próximo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
De um nome para o seu projeto e clique em próximo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defina as configurações como abaixo e clique em criar | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Em seu Solution Explorer deve ter os arquivos da imagem abaixo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar nosso repositorio do Git | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Clique com o botão direito sobre a Solução e Criar Repositório do Git | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Configure o Git como a imagem abaixo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Não esqueça de alterar o .gitignore para Visual Studio, definir o nome a descrição e clique em create e push | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Acesse o seu git e verá que foi criado o seu repositório e foi feito um push do código inicial | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bora codar nossa api, mas antes execute seu projeto para ver se esta tudo ok | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ao executar seu projeto se apareceu o swagger execute o mesmo e verifique se esta recebendo uma resposta da sua api | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pare sua api e vamos codar | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Apague os arquivos WeatherForecastController e WeatherForecast | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos instalar as bibliotecas em nosso projeto, clique com o botão direito em dependencies e Manage Nuget Packages | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Irá abrir a tela abaixo, selecione Browse e procure pela dependência, informe a versão e instalar vamos instalar uma por uma | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bibliotecas instaladas | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar uma pasta Dominios onde irá ficar nossa classe que irá representar o local e dentro dela nossa classe Local | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Clique com o botão direito na pasta Dominios e crie uma classe | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defina o nome e clique em Add | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Nossa classe Local irá ficar como o código abaixo: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar uma pasta para nossas Interfaces e criar uma interface com o nome ILocalRepositorio, implemente o código abaixo: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Nossa interface terá apenas um método que retornar os locais mais próximos de um determinado ponto e dentro de um faixa de distancia | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar nosso contexto e criar nosso banco de dados | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Crie uma pasta com o nome Contextos e dentro uma classe DbLocalContext | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bora implementar nosso contexto | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Herda o DbContext da Biblioteca Microsoft.EntityFrameworkCore | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Define o DbSet Locais que representa nossa tabela no banco | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sobrescrevemos o método OnConfiguring para definir a nossa conexão com o banco de dados, no caso SQL Server | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos gerar nosso banco através do entity framework | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Abra o Nuget Package Console - Tools -> Nuget Package Manager -> Package Manager Nuget | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
No package manage console digite: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
add-migration Banco-Inicial + Enter | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Será criada a pasta migrations com dois arquivos dentro como na firgura | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
O arquivo Banco-Inicial contém o script para geração do banco de dados | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
No package manage console digite update-database + enter | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Aparecendo Done informa que o banco foi criado e pode ser usado | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos conectar em nosso banco de dados, vai no menu tools → Connect Database | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Informe o Server Name e selecione o banco de dados que criou | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Verificar no Server Explorer o banco e a tabela Locais | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Com o banco criado vamos popular o mesmo, para isto vamos sobrescrever o método OnModelCreating em nossa classe DbLocalContext, usei a latitude e longitude de locais próximos a mim, inclua o código abaixo na classe DbLocalContext | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
No package manage console digite Add-Migration SeedInitialData para criar um novo arquivo com o script para inserção dos dados no banco | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Deve ter um novo arquivo SeedInitialData na pasta Migrations e o seu código parecido com o abaixo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Agora digite update-database e verifique seu banco de dados | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Para vizualizar os dados clique sobre a tabela no Server Explorer e em Show Table Data | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos implementar nosso repositório, crie uma pasta Repositorios no projeto e dentro uma classe LocalRepositorio | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Implemente o código abaixo: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar nossos Data Transfers Objects, no caso será um para o request e outro para o response | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Crie uma pasta DataTransferObject e dentro duas classes LocalRequestDTO e LocalResponseDTO | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Implemente o código abaixo na classe LocalRequestDTO | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Estamos obrigando a passar a Latitude e Longitude e caso não passe e gerado um erro, no caso dos metros caso não seja informado ele por default será 1000. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Nossa classe LocalResponseDTO irá ficar como o código abaixo: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos criar o Controller LocalController, clique com o botão direitos sobre a pasta Controllers e selecione Controller | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Selecione Api Controller - Empty e clique em próximo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Informe o nome e clique em Adicionar | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Controller criado | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos injetar nossa dependência da Interface ILocalRepositorio como o código abaixo: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Não esqueça de configurar a Interface na classe Program.cs | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Em nossa classe LocalController vamos incluir os métodos que irão fazer o calculo da distancia | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
E por último mas não menos importante vamos implementar nosso método Get | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execute o projeto, com o swagger informe a latitude e a longitude, no caso estou usando -23.5313603, -46.5580917 e clique em executar, aumente e diminua a distância para ver se esta realmente seguindo a regra | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Response | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Não esqueça de criar um push para o GitHub | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Espero que tenha gostado | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Para receber mais conteúdo inscreva-se no canal e siga nas redes sociais | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vamos que vamos |