Aplicación web desarrollada con ASP.NET Core 8.0 y PostgreSQL que permite gestionar un catálogo de productos de manera sencilla y eficiente.
- ✅ Listado de productos con información detallada (ID, Nombre, Precio)
- ➕ Creación de nuevos productos con validación de datos
- 🔒 Protección CSRF con validación de tokens anti-falsificación
- 🏗️ Arquitectura limpia con separación de responsabilidades (MVC)
- 💾 Acceso a datos encapsulado en una capa de modelo (patrón Repository simplificado)
- ⚡ Operaciones asíncronas para mejor rendimiento
- 🔐 Gestión segura de credenciales mediante inyección de dependencias y configuración externa
- Framework: ASP.NET Core 8.0 MVC
- Base de Datos: PostgreSQL
- ORM/Micro-ORM: Dapper 2.1.66
- Driver de PostgreSQL: Npgsql 9.0.4
- Lenguaje: C# (.NET 8.0)
- Frontend: Bootstrap, jQuery, Razor Views
postgres_test/
├── Controllers/
│ └── HomeController.cs # Controlador principal
├── Models/
│ ├── Producto.cs # Modelo de datos del producto
│ └── BD.cs # Capa de acceso a datos
├── Views/
│ ├── Home/
│ │ ├── Index.cshtml # Vista listado de productos
│ │ └── Create.cshtml # Vista formulario de creación
│ └── Shared/
│ └── _Layout.cshtml # Layout principal
├── wwwroot/ # Archivos estáticos (CSS, JS)
├── Program.cs # Punto de entrada de la aplicación
└── postgres_test.csproj # Archivo de proyecto
Antes de ejecutar el proyecto, asegúrate de tener instalado:
- .NET 8.0 SDK
- PostgreSQL (versión 12 o superior)
- Un editor de código (recomendado: Visual Studio Code o Visual Studio)
CREATE DATABASE test_productos;
psql -U postgres -d test_productos
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio NUMERIC(10, 2) NOT NULL CHECK (precio > 0)
);
INSERT INTO productos (nombre, precio) VALUES
('Laptop HP', 899.99),
('Mouse Logitech', 29.99),
('Teclado Mecánico', 149.99),
('Monitor LG 24"', 199.99),
('Auriculares Sony', 79.99);
La aplicación utiliza el sistema de configuración estándar de ASP.NET Core para gestionar las credenciales de forma segura.
Pasos para configurar (IMPORTANTE):
- Crear archivo de configuración de desarrollo: Crea el archivo
appsettings.Development.json
en la raíz del proyecto:
# Copia el archivo de ejemplo
cp appsettings.Development.example.json appsettings.Development.json
- Editar con tus credenciales: Abre
appsettings.Development.json
y configura tu cadena de conexión:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"PostgreSQL": "Host=localhost;Port=5432;Database=test_productos;Username=postgres;Password=TU_CONTRASEÑA_REAL"
}
}
⚠️ IMPORTANTE: El archivoappsettings.Development.json
está en.gitignore
y NO se subirá al repositorio. Es seguro poner tus credenciales aquí.
- Archivo base (appsettings.json): Este archivo SÍ se sube al repositorio pero NO contiene credenciales sensibles, solo la estructura:
{
"ConnectionStrings": {
"PostgreSQL": ""
}
}
ASP.NET Core carga los archivos en este orden (cada uno sobrescribe al anterior):
1️⃣ appsettings.json ← Base (sin credenciales) ✅ En Git
⬇️ (sobrescribe)
2️⃣ appsettings.Development.json ← Desarrollo (con credenciales) 🚫 NO en Git
⬇️ (sobrescribe)
3️⃣ Variables de entorno ← Producción (opcional)
📁 Proyecto
├── appsettings.json ✅ En Git - SIN credenciales
├── appsettings.Development.json 🚫 NO en Git - CON credenciales (crear manualmente)
├── appsettings.Development.example.json ✅ En Git - Plantilla sin credenciales
└── .gitignore ✅ Protege archivos sensibles
El entorno se detecta automáticamente:
- Desarrollo local (
dotnet run
): Usaappsettings.Development.json
- Producción: Usa
appsettings.Production.json
o variables de entorno
Para producción, puedes crear appsettings.Production.json
(también ignorado por git) o usar variables de entorno.
En macOS/Linux:
export ASPNETCORE_ENVIRONMENT=Production
export ConnectionStrings__PostgreSQL="Host=localhost;Port=5432;Database=test_productos;Username=postgres;Password=TU_CONTRASEÑA"
dotnet run
En Windows (PowerShell):
$env:ASPNETCORE_ENVIRONMENT="Production"
$env:ConnectionStrings__PostgreSQL="Host=localhost;Port=5432;Database=test_productos;Username=postgres;Password=TU_CONTRASEÑA"
dotnet run
La aplicación implementa las siguientes mejores prácticas:
✅ Configuración por entornos: Usa el sistema estándar de ASP.NET Core
✅ Inyección de dependencias: La clase BD
se registra como servicio en Program.cs
✅ Separación de configuración: Las credenciales están en archivos de configuración, no en código
✅ Archivo .gitignore: Previene que appsettings.Development.json
se suba al repositorio
✅ Archivo de ejemplo: appsettings.Development.example.json
sirve como plantilla sin credenciales reales
✅ Carga automática: ASP.NET Core carga automáticamente el archivo según el entorno
Código en Program.cs:
// ASP.NET Core carga automáticamente appsettings.{Environment}.json
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<BD>(provider =>
{
var configuration = provider.GetRequiredService<IConfiguration>();
var connectionString = configuration.GetConnectionString("PostgreSQL");
return new BD(connectionString);
});
Código en HomeController.cs:
public class HomeController : Controller
{
private readonly BD _bd;
// Inyección de dependencias - NO hay credenciales en el código
public HomeController(BD bd)
{
_bd = bd;
}
}
-
Navega al directorio del proyecto:
cd postgres_test
-
Restaurar las dependencias:
dotnet restore
-
Ejecutar la aplicación:
dotnet run
-
Abre tu navegador en la URL que figura en la terminal
- Muestra todos los productos en una tabla
- Columnas: ID, Nombre, Precio
- Botón para crear un nuevo producto
- Formulario con validación del lado del cliente y servidor
- Campos:
- Nombre: Obligatorio, máximo 100 caracteres
- Precio: Obligatorio, debe estar entre 0.01 y 9,999,999.99