simpre los controladores se crean con el nombre del controlador seguido de la palabra controller todo pegado
debase heredar de la clase controllerBase para que el mismo sea un controlador
public class AutoresController: ControllerBase
{
}
using Microsoft.AspNetCore.Mvc;
Ademas colocamos lo siguiente en nuestra casa para poder usar las funcionalidades de los controladores.
[ApiController]
Después de esto, nuestra clase debería verse así.
using Microsoft.AspNetCore.Mvc;
namespace PracticaLP.Controllers
{
[ApiController]
[Route("api/autores")]
public class AutoresController: ControllerBase
{
}
}
El mismo que me permite hacer? que si hacemos un Get request a nuestra api/authors nos devuelva una lista de autores.
namespace PracticaLP.Entidades
{
public class Author
{
public int id { get; set; }
public string nombre { get; set; }
}
}
using Microsoft.AspNetCore.Mvc;
using PracticaLP.Entidades;
namespace PracticaLP.Controllers
{
[ApiController]
[Route("api/autores")]
public class AutoresController: ControllerBase
{
[HttpGet]
public ActionResult<List<Author>> Get()
{
return new List<Author>()
{
new Author() { Id = 1, nombre = "Alejandro Jimenez"},
new Author() { Id = 2, nombre = "Jose Miguel Fernandez"}
};
}
}
}
Cabe señalar que el programa funciona correctamente sin esto, pero por un tema de organización voy a crear esta clase y mover los códigos de nuestra clase de programas
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
namespace PracticaLP
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection service)
{
service.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
service.AddEndpointsApiExplorer();
service.AddSwaggerGen();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
//app.MapControllers();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
internal void ConfigureServicces(IServiceCollection services)
{
throw new NotImplementedException();
}
}
}
y nuestra Clase de programs debe quedar asi.
using PracticaLP;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);
var app = builder.Build();
// Configure the HTTP request pipeline.
startup.Configure(app, app.Environment);
app.Run();
También podemos configurar la cadena de conexión, que es lo que dice a que base de datos nos estamos conectando, además de esto nos permito colocar validación para nuestras tablas entre otras cosas.
Instalando en el proyecto...
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.tool
Procederemos a usarlo, Lo primero que debemos hacer es crear una Clase. Yo Creare la Clase ApplicationDbContext.cs
using Microsoft.EntityFrameworkCore;
namespace PracticaLP
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options) : base(options)
{
}
}
}
Esta seria nuestra clase ApplicationDbContext con ella podemos hacer las diferentes configuraciones de nuestro DBContext. pero ademas podemos colocar las tablas que se crearan en nuestra base de datos.
public DbSet<Maestro> Maestros { get; set; }
Lo que le digo al sistema en este caso es que se creará una tabla a partir de la Clase Maestro con sus valores.
using Microsoft.EntityFrameworkCore;
using PracticaLP.Entidades;
namespace PracticaLP
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Maestro> Maestros { get; set; }
}
}
esto quiere decir que se creara una tabla con los valores que tenemos en nuestra clase de Maestro. Clara que para esto primero debemos configurar nuestra conexion a base de datos y esto lo haremos en appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"defaultConnection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=WebApis;Integrated Security=True;Encrypt=False"
},
"AllowedHosts": "*"
}
Explicaremos un poco lo que hicimos:
El Data Source Serial el nombre del servidor de Base de Datos El Initial Catalog Seria el nombre de la base de datos que utilizarmos el Integrated Security se refiere a que utilizarmos la claves del sistema operativo Windows para autenticarnos en la DB.
Nota: Tambien podemos colocar en este caso un usuario y password si lo deseamos.
Ahora volvemos a la clase Startup al método configure services en el cual configuraremos nuestra conexión a la base de datos, que en nuestro caso es sql server
using Microsoft.EntityFrameworkCore;
namespace PracticaLP
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection service)
{
service.AddControllers();
service.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("defaultConnection")));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
service.AddEndpointsApiExplorer();
service.AddSwaggerGen();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
//app.MapControllers();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
internal void ConfigureServicces(IServiceCollection services)
{
throw new NotImplementedException();
}
}
}
Add-Migration Inicial
Si digitamos este codigo en el Package Manager Console realizaremos una migracion de nuestros modelos a nuestras bases de datos.
Entonces vamos a trabajar con la creación de registros en nuestra base de datos, lo que vamos a hacer primero es que vamos a crear una acción httppost aquí para que los clientes de nuestra aplicación web puedan enviarnos un autor que ellos quieran. crear en la base de datos
Para poder usar el AplicationDbContext que creamos anteriormente, necesito usar la inyección de dependencia.
private readonly ApplicationDbContext context;
public AutoresController(ApplicationDbContext context)
{
this.context = context;
}
Puedo colocar el constructor de mi clase ApplicationDbContext de autores y aquí recibiré una instancia de aplicacióndbcontext
La inicializaré como un campo por lo tanto, es accesible acceder a ella desde cualquier parte de mi clase.
Ya hemos visto cómo hacer esto en el aula.
En cualquier caso, siéntase libre de preguntarme si tiene alguna pregunta. Esto es fundamental para que el código funcione de manera efectiva.
Cuándo configuramos está applicationdbcontext en un sistema de inyección de dependencias, lo configuramos cuando en la clase Startup dijitamos el siguiente codigo
service.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("defaultConnection")));
[HttpPost]
public async Task<ActionResult> Post(Author autor)
{
context.Add(autor);
await context.SaveChangesAsync();
return Ok();
}
Aprovechando que tenemos este ApplicationDbContext aquí yo lo que voy a hacer Es que voy a retornar un listado de autores de la base de datos para eso cómo Vamos a comunicarnos con una base de datos la buena práctica es utilizar programación asíncrona y para utilizar programación asíncrona en un método debo Utilizar async - await
public ActionResult<List<Author>> Get()
{
return new List<Maestro>()
{
new Maestro() { Id = 1, nombre = "Alejandro Jimenez"},
new Maestro() { Id = 2, nombre = "Jose Miguel Fernandez"}
};
}
[HttpGet]
public async Task<ActionResult<List<Author>>> Get()
{
return await context.Authores.ToListAsync();
}
Como era de esperar, tenemos que realizar validaciones para saber si el registro actualizado existe en la base de datos.
[HttpPut("{id:int}")] // api/autores/1
public async Task<ActionResult> Put(Autor autor, int id)
{
var existe = await context.Authores.AnyAsync(x => x.Id == id);
if (!existe)
{
return BadRequest("El id no existe en la base de datos");
}
if (id != autor.Id)
{
return BadRequest("El id del autor y el id de la ruta no coinciden");
}
context.Update(autor);
await context.SaveChangesAsync();
return Ok();
}
[HttpPut("{id:int}")]
De esta forma hacemos que nuestra api espere un parámetro, en nuestro caso un id que nos permitirá validar nuestra actualización a la base de datos.
api/autores/1
[HttpDelete("{id:int}")] //api/autores/1
public async Task<ActionResult> Delete(int id)
{
var existe = await context.Authores.AnyAsync(x => x.Id == id);
if (!existe)
{
return BadRequest("El id no existe en la base de datos");
}
context.Remove(new Autor() { Id = id });
await context.SaveChangesAsync();
return Ok();
}