Para criar uma API em C# digite o seguinte comando abaixo
dotnet new web
Feito isso será criada uma aplicação web . para rodar a nossa aplicação execute o comando abaixo
dotnet run
para adicionar o arquivo gitignore
digite o seguinte comando
dotnet new gitignore
Para buscar pacotes e biblotecas para .net use o site abaixo para pesquisar o pacote
https://www.nuget.org/
Para a documentação de pacotes e comandos acesse o site abaixo
https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet
Para iniciar nosso projeto, crie uma pasta chamada src
e, dentro dela, um diretório models
.
Feito isso precisamos criar e definir o namespsace
desse arquivo. o namespace
ele mostra o caminho lógico entre pastas. por exemplo, vamos supor que tenho a pasta models dentro src
e dentro de models possuo a pasta users
e nela possui dois arquivos um chamado CreateUser.cs
e outro ListUsers.cs
o name espace deles seriam iguais pois estão no mesmo dir
namespace NAMESPACE {
}
Vamos iniciar a configuração do banco de dados. Para isso, precisamos instalar o pacote do Entity Framework. Veja o comando abaixo. Note que já estou definindo qual banco de dados estou usando.
dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 8.0.1
Uma vez concluída a instalação, precisamos instalar outro pacote que gera as migrações.
dotnet add package Microsoft.EntityFrameworkCore.Design
Pronto, agora podemos criar nossa conexão com o banco de dados. Crie uma pasta chamada configs
ou um nome da sua escolha. Feito isso crie o arquivo responsável pela sua conexão com o banco de dados. Veja também que foi criada uma entidade do tipo User e nela veremos depois de como é feita.
using Microsoft.EntityFrameworkCore;
using src.Models.Users.infra.Entities;
namespace src.configs.DataBase
{
public class Connection : DbContext {
public DbSet<UsersModels> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options) =>
options.UseSqlite("DataSource=app.db;Cache=Shared");
}
}
Agora precisamos definir nossa entidade. Para isso, vamos seguir o código abaixo. Para facilitar o 'autocompletar
', podemos digitar o comando 'prop'.
namespace src.Models.Users.infra.Entities
{
public class Users {
public string Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public DateTime CreatedAt { get; set; }
}
}
Proto agora podemos importar o nosso código no arquivo connect.cs
Para rodarmos as migrations referentes a classe de user como foi feito o exemplo acima, executamos o seguinte comando
dotnet ef migrations add NomeDaMigrations
Agora precisamos atualizar o banco de dados com o comando
dotnet ef database update
Para implementar nossos controllers precisamos fazer o seguinte. Criar o arquivo semelhante a esse Código abaixo
using System.Reflection.Metadata;
using Microsoft.AspNetCore.Mvc;
namespace src.Models.Users.Controllers
{
[ApiController]
class UsersController : ControllerBase
{
[HttpGet]
[Route("/response")]
public string Handle() {
return "response router";
}
}
}
Perceba se que definimos a rota que sera passada nos decorators
. para criar um prefixo de uma rota podemos fazer da seguinte forma.
namespace src.Models.Users.Controllers
{
[ApiController]
[Route("users")]
public class UsersController : ControllerBase
{
[HttpGet]
[Route("/")]
public string Handle() {
return "response router";
}
}
}
Outra maneira de definir nossas rotas é desta forma.
namespace src.Models.Users.Controllers
{
[ApiController]
[Route("users")]
class UsersController : ControllerBase
{
[HttpGet("/")]
public string Handle() {
return "response router";
}
}
}
Para definir e instanciar controllers, precisamos fazer a seguinte configuração.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
Com o EntityFramework
, em algumas hipóteses, não podemos ter mais de uma conexão com o banco de dados aberta. Para gerenciar isso, precisamos efetuar injeções sempre que instanciamos uma conexão com o banco de dados. Siga os passos abaixo para isso:
builder.Services.AddDbContext<Connection>(); // var tipo banco de dados
O código completo ficará assim:
using src.configs.DataBase;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<Connection>(); // var tipo banco de dados
var app = builder.Build();
app.MapControllers();
app.Run();
Feito isso podemos importar no nossos controller a instancia para injetar as dependências. além disso mudamos o tipo de retorno da função para uma lista do tipo users
using Microsoft.AspNetCore.Mvc;
using src.configs.DataBase;
using src.Models.Users.infra.Entities;
namespace src.Controllers
{
[ApiController]
[Route("users")]
class UsersController : ControllerBase
{
[HttpGet]
[Route("/")]
public List<Users> Handle([FromServices] Connection context) // inject dependencie
{
return context.Users.ToList();
}
}
}
Para criar um registro através de uma rota Post
, siga a instrução abaixo.
[HttpPost]
public Users Post([FromBody] Users user, [FromServices] AppDbContext context)
{
context.Users.Add(user);
context.SaveChanges();
return user;
}
Para buscar um registro pelo id podemos fazer da seguinte forma
[HttpGet("{id}")]
public Users GetById(string id, [FromServices] AppDbContext context)
{
return context.Users.FirstOrDefault(user => user.Id == id);
}
[HttpPut("{id}")]
public Users Put(string id, [FromBody] Users user, [FromServices] AppDbContext context)
{
var findUser = context.Users.FirstOrDefault(user => user.Id == id);
if(findUser == null) {
return null;
}
findUser.Email = user.Email;
findUser.Name = user.Name;
findUser.UserName = user.UserName;
context.Users.Update(findUser);
context.SaveChanges();
return user;
}