Criando API Em C#

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

Criando e Configurando o projeto

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

Definindo Controllers

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();

Injeção de Dependências

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();
    }
  }
}

Criando um Registro

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;
    }

Buscando um Registro pelo Id

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);
    }

Fazendo um PUT

[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;
    }

Removendo um Registro