Selaa lähdekoodia

chore: upgrade to .net9

Mariano Z. 11 kuukautta sitten
vanhempi
commit
a38784dca2

+ 2 - 2
Dockerfile

@@ -1,5 +1,5 @@
 # Use the official .NET SDK image as a build stage
-FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
 WORKDIR /app
 
 # Copy the solution and global.json to the container
@@ -19,7 +19,7 @@ WORKDIR /app/Products.Backoffice
 RUN dotnet publish -c Release -o out
 
 # Use the official .NET runtime image as the final base image
-FROM mcr.microsoft.com/dotnet/aspnet:8.0
+FROM mcr.microsoft.com/dotnet/aspnet:9.0
 WORKDIR /app
 COPY --from=build /app/Products.Backoffice/out ./
 

+ 5 - 5
Products.API/Products.API.csproj

@@ -1,16 +1,16 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
     <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
+        <TargetFramework>net9.0</TargetFramework>
         <Nullable>enable</Nullable>
         <ImplicitUsings>enable</ImplicitUsings>
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.4" />
-        <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.3" />
-        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.2" />
-        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
+        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.4" />
+        <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.4" />
+        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
+        <PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.0" />
     </ItemGroup>
 
 

+ 1 - 1
Products.Backoffice/Products.Backoffice.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
     <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
+        <TargetFramework>net9.0</TargetFramework>
         <Nullable>enable</Nullable>
         <ImplicitUsings>enable</ImplicitUsings>
     </PropertyGroup>

+ 3 - 3
Products.Business/Products.Business.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
     <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
+        <TargetFramework>net9.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
     </PropertyGroup>
@@ -11,8 +11,8 @@
     </ItemGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.4" />
-        <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.3" />
+        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.4" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.4" />
     </ItemGroup>
 
 </Project>

+ 2 - 2
Products.Common/Dtos/ErrorResponseDto.cs

@@ -1,4 +1,4 @@
-using Newtonsoft.Json;
+using System.Text.Json;
 
 namespace Products.Common.Dtos
 {
@@ -9,7 +9,7 @@ namespace Products.Common.Dtos
 
     public override string ToString()
     {
-      return JsonConvert.SerializeObject(this);
+      return JsonSerializer.Serialize(this);
     }
   }
 

+ 1 - 12
Products.Common/Products.Common.csproj

@@ -1,19 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
     <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
+        <TargetFramework>net9.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
     </PropertyGroup>
-
-    <ItemGroup>
-      <Reference Include="Newtonsoft.Json">
-        <HintPath>..\..\..\..\..\.nuget\packages\newtonsoft.json\13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll</HintPath>
-      </Reference>
-    </ItemGroup>
-
-    <ItemGroup>
-      <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
-    </ItemGroup>
-
 </Project>

+ 163 - 79
README.md

@@ -1,102 +1,186 @@
-## Ejemplo de Aplicación .NET con MVC y API REST 🚀
+# Aplicación de Gestión de Productos con .NET y Svelte
 
-A continuación, encontrarás instrucciones detalladas sobre cómo configurar y ejecutar este proyecto .NET. El proyecto consta de varios componentes que incluyen lógica de negocio, aplicaciones web y una API REST para administrar productos.
+Este proyecto es un ejemplo educativo que muestra cómo crear una aplicación web completa utilizando .NET para el backend y Svelte para el frontend, implementando patrones de diseño modernos y buenas prácticas de desarrollo.
 
-## Estructura del Proyecto
+## Descripción del Proyecto
 
-La estructura del proyecto es la siguiente:
+La aplicación permite gestionar un catálogo de productos con operaciones CRUD (Crear, Leer, Actualizar, Eliminar) a través de diferentes interfaces:
+
+- **API REST**: Ofrece endpoints para manipular productos a través de HTTP
+- **Backoffice (MVC)**: Interfaz administrativa basada en ASP.NET MVC
+- **Frontoffice (Svelte)**: Interfaz de usuario moderna construida con SvelteKit
+
+## Arquitectura del Proyecto
+
+El proyecto sigue una arquitectura en capas con los siguientes componentes:
 
 ```
-- global.json
-- Products.sln
-- Products.Common/
-- Products.Business/
-- Products.Backoffice/
-- Products.API/
-- Products.Frontoffice/
+- Products.sln                 # Solución principal
+- Products.Common/             # DTOs, excepciones y tipos compartidos
+- Products.Business/           # Lógica de negocio, servicios y repositorios
+- Products.API/                # API REST
+- Products.Backoffice/         # Aplicación MVC para administración
+- Products.Frontoffice/        # Frontend con Svelte
 ```
 
-- **global.json**: Archivo de configuración global para la versión de .NET SDK.
-- **Products.sln**: Archivo de solución principal del proyecto.
-- **Products.Common**: Contiene DTOs y excepciones compartidas.
-- **Products.Business**: Contiene la lógica de negocio del proyecto, incluidos servicios y repositorios.
-- **Products.Backoffice**: Aplicación MVC para el backoffice de administración.
-- **Products.API**: Aplicación MVC que expone una API REST para administrar productos.
-- **Products.Frontoffice**: Proyecto Svelte que muestra cómo consumir la API REST.
+### Patrón de Arquitectura
+
+- **Diseño por Capas**: Separación clara de responsabilidades entre capas
+- **Patrón Repositorio**: Abstracción del acceso a datos
+- **Inyección de Dependencias**: Acoplamiento débil entre componentes
+- **MVC (Model-View-Controller)**: Para la aplicación Backoffice
+- **REST**: Para la API de servicios
+
+## Tecnologías Utilizadas
+
+### Backend
+
+- **.NET 9**: Framework base para el desarrollo
+- **ASP.NET Core**: Para la API REST y aplicación MVC
+- **Entity Framework Core**: ORM para acceso a datos
+- **AutoMapper**: Para mapeo entre objetos de dominio y DTOs
+- **Newtonsoft.Json**: Para serialización/deserialización JSON
+- **In-Memory Database**: Para almacenamiento de datos (en este ejemplo educativo)
+
+### Frontend
+
+- **SvelteKit**: Framework para la creación de la interfaz de usuario
+- **TypeScript**: Para tipado estático en el frontend
+- **Axios**: Para comunicación HTTP con la API
+- **Zod**: Para validación de datos en el cliente
+
+### DevOps
+
+- **Docker**: Para contenerización de la aplicación
+- **Fly.io**: Ejemplo de despliegue en la nube
+
+## Patrones de Diseño Implementados
+
+- **DTO (Data Transfer Objects)**: Para transferencia de datos entre capas
+- **Repositorio**: Para abstracción del acceso a datos
+- **Servicios**: Para encapsular la lógica de negocio
+- **Middleware**: Para manejo centralizado de excepciones
+- **CORS**: Configuración para permitir solicitudes cross-origin
+- **Enumeraciones**: Para tipos de datos con valores predefinidos (Colores)
+
+## Configuración del Entorno de Desarrollo
 
-## Pasos para Iniciar
+### Requisitos Previos
 
-A continuación, se describen los pasos para configurar y ejecutar el proyecto:
+- [.NET 9 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)
+- [Node.js](https://nodejs.org/) (v20.x o superior)
 
-1. **Requisitos Previos**:
-   - Asegúrate de tener instalado el SDK de .NET en tu máquina.
-   - Asegúrate de tener Node.js instalado para ejecutar el proyecto Svelte.
+### Pasos para Ejecutar el Proyecto
 
-2. **Clonar el Repositorio**:
-   Clona el repositorio del proyecto desde su ubicación.
+1. **Clonar el Repositorio**:
+
+   ```
+   git clone <url-del-repositorio>
+   cd Products
+   ```
+
+2. **Restaurar Paquetes NuGet**:
 
-4. **Restaurar Paquetes NuGet**:
-   Abre una terminal en la ubicación de la solución (`Products.sln`) y ejecuta el comando:
    ```
    dotnet restore
    ```
 
-5. **Ejecutar Aplicaciones MVC**:
-   - Para el proyecto Backoffice, navega a la carpeta `Products.Backoffice` en la terminal y ejecuta:
-     ```bash
-     dotnet run
-     ```
-     o desde la raiz del proyecto:
-     ```bash
-     dotnet run --project Products.Backoffice
-     ```
-   - Para el proyecto API, navega a la carpeta `Products.API` en la terminal y ejecuta:
-     ```
-     dotnet run
-     ```
-     o desde la raiz del proyecto:
-     ```bash
-     dotnet run --project Products.API
-     ```
-
-6. **Ejecutar Proyecto Svelte**:
-   - Navega a la carpeta `Products.Frontoffice` en la terminal.
-   - Instala las dependencias ejecutando `npm install`.
-   - Luego, inicia la aplicación con `npm run dev`.
-
-7. **¡Listo!**:
-   Ahora puedes acceder a las aplicaciones MVC desde tu navegador y probar la API REST.
-  Además, el proyecto Svelte te mostrará cómo consumir la API desde un frontend.
-
-## Migraciones (branch `migrations`)
-
-Inrtalar `dotnet ef` ([how-to](httpr://learn.microsoft.com/en-us/ef/core/cli/dotnet)) para poder gestionar las migraciones.
-
-- `dotnet ef database update`: Actualiza la base de datos
-- `dotnet ef migrations add <nombre de la migración>`: Crea una nueva migración
-- `dotnet ef migrations remove <nombre de la migración>`: Elimina una migración
-- `dotnet ef migrations list`: Lista las migraciones
-
-```bash
-dotnet ef database update
-dotnet ef migrations add <nombre de la migración>
-dotnet ef migrations remove <nombre de la migración>
-dotnet ef migrations list
-```
+3. **Ejecutar la API REST**:
+
+   ```
+   dotnet run --project Products.API
+   ```
+
+   La API estará disponible en: https://localhost:7234 (o http://localhost:5192)
+
+4. **Ejecutar la Aplicación Backoffice (MVC)**:
+
+   ```
+   dotnet run --project Products.Backoffice
+   ```
 
-**Nota**: Como este proyecto utiliza la base de datos SQLite, es imporante que se respete la ubicación de la base de datos.
-Es por ello que los comandos deben se ejecutados desde la raiz del proyecto haciendo uso del flag `--project`.
+   La aplicación MVC estará disponible en: https://localhost:7103
 
-```bash
-dotnet ef database update --project Products.Business
-dotnet ef migrations add <nombre de la migración> --project Products.Business
-dotnet ef migrations remove <nombre de la migración> --project Products.Business
-dotnet ef migrations list --project Products.Business
+5. **Ejecutar la Aplicación Frontoffice (Svelte)**:
+   ```
+   cd Products.Frontoffice
+   npm install
+   npm run dev
+   ```
+   La aplicación Svelte estará disponible en: http://localhost:5173
+
+## Estructura del Código
+
+### Products.Common
+
+Contiene elementos compartidos:
+
+- **Dtos/**: Objetos de transferencia de datos
+- **Types/**: Enumeraciones y tipos personalizados
+- **Exceptions/**: Excepciones personalizadas
+
+### Products.Business
+
+Contiene la lógica de negocio:
+
+- **Domain/**: Entidades de dominio
+- **Service/**: Servicios que implementan la lógica de negocio
+- **Repository/**: Acceso a datos
+- **Persistence/**: Contexto de Entity Framework
+- **AutoMapperProfiles/**: Configuración de mapeo entre entidades y DTOs
+
+### Products.API
+
+API REST:
+
+- **Controllers/**: Endpoints de la API
+- **Middlewares/**: Configuración de middleware para manejo de excepciones
+
+### Products.Backoffice
+
+Aplicación MVC:
+
+- **Controllers/**: Controladores MVC
+- **Views/**: Vistas Razor
+- **Models/**: ViewModels específicos para la UI
+
+### Products.Frontoffice
+
+Aplicación Svelte:
+
+- **src/routes/**: Páginas y componentes
+- **src/lib/**: Utilidades, stores y lógica compartida
+- **src/lib/api.ts**: Cliente de la API REST
+
+## Aspectos Educativos del Proyecto
+
+Este proyecto sirve como referencia para aprender sobre:
+
+1. **Arquitectura en Capas**: Separación de responsabilidades
+2. **API REST**: Principios y buenas prácticas
+3. **Inyección de Dependencias**: Configuración y uso en .NET
+4. **Entity Framework Core**: Configuración básica y seeds
+5. **Manejo de Excepciones**: Middleware centralizado
+6. **Validación de Datos**: Tanto en backend como frontend
+7. **Frontend Moderno**: Integración con frameworks modernos (Svelte)
+8. **Serialización/Deserialización**: Conversión entre objetos y JSON
+9. **Enumeraciones**: Uso en C# y TypeScript
+10. **Patrones de Repositorio y Servicio**: Implementación práctica
+
+## Despliegue
+
+El proyecto incluye un Dockerfile para contenerización y puede ser desplegado en servicios como Fly.io:
+
+```
+fly deploy
 ```
 
-## Deploy en Fly.io
+Un ejemplo de despliegue está disponible en: https://tsi-products.fly.dev/
+
+## Licencia
 
-Se ha realizado un deploy de la aplicación MVC en Fly.io. Puedes acceder a ella desde el siguiente enlace:
-https://tsi-products.fly.dev/
+Este proyecto está bajo la Licencia MIT. Ver el archivo [LICENSE](LICENSE) para más detalles.
 
+---
 
+**Nota**: Este proyecto es principalmente educativo y está diseñado para demostrar conceptos y patrones en un entorno simplificado. Algunas prácticas pueden necesitar ser adaptadas para aplicaciones de producción a gran escala.

+ 1 - 2
global.json

@@ -1,8 +1,7 @@
 {
   "sdk": {
-    "version": "8.0.0",
+    "version": "9.0.202",
     "rollForward": "latestMajor",
     "allowPrerelease": true
   }
 }
-

+ 2 - 0
mise.toml

@@ -0,0 +1,2 @@
+[tools]
+dotnet = "9.0"