La idea de este proyecto es crear una versión 1.0 de un blog escrito desde cero hasta subirlo a producción a diferentes posibles proveedores de hostings, para no vernos limitados y elegir la opción que mejor se adapte a nuestras necesidades. Todo lo que hagamos quedará subido a Github y estará abierto para que cualquiera pueda cogerlo.
Si tienes ideas sobre cómo mejorarlo, extender funcionalidades o cosas que te gustaría que el blog tuviera, no dudes en hacérmelo saber, pues una vez tengamos la versión 1.0, la idea es construir a partir de ahí diferentes funcionalidades.
Aquí os iré dejando los temas que vaya creando para el blog en orden. Esta lista puede cambiar y ampliarse o reducirse, pues por ahora sólo será un esbozo de las diferentes partes. A priori, los temas los separaré por las capas a las que pertecen inicialmente, pero según avancemos, tendré que afectar a todas las capas, por lo que volveremos a unificar la ruta en el apartado «Blog».
Pre-requisitos
- Conocimiento básico de C# 9 en adelante
- Entender los pilares básicos de la Programación Orientada a Objetos (Abstracción, Herencia, Polimorfismo y Encapsulamiento)
- Idealmente conocer los principios SOLID
General
- Características de la versión 1.0 del Blog
- Entendiendo las capas de Dominio, Infraestructura, Aplicación y UI
Configuración inicial
- ¿Cómo subir a Github un repositorio con múltiples proyectos?
- Creando solución en blanco, explicación de las carpetas, librerías de clases y tests
- ¿Cómo relacionar las capas de una solución con múltiples proyectos?
- ¿Cómo establecer uno o varios proyecto de inicio?
Configuración Dominio
- ¿Qué entendemos por una Entidad?
- ¿Qué es una capa de dominio anémica?
- ¿Qué son las lógicas de negocio?
- Entendiendo y definiendo las lógicas de negocio de nuestro Blog
- Definiendo las primeras entidades del blog y relaciones en base a las lógicas de negocio
- ¿Por qué utilizar el método factoría para crear nuestros objetos?
- Excepciones personalizadas vs. Objeto Result<T>
- Definiendo el objeto Result<T>
- Creando Tests Unitarios para nuestras entidades con XUnit
- ¿Qué entendemos por Value Object y para qué sirven?
- Definiendo interfaces genéricas y clases utilitarias
Configuración Infraestructura
- Appsettings.json vs. Clase C# para configuración y seguridad
- Creando un archivo de configuración general para ADO.NET
- Configurando Entity Framework
- Creando un repositorio base con ADO.NET
- Creando un repositorio base con Entity Framework
- Creando la base de datos y tablas en SQL Server con SSMS
- Implementando repositorios CRUD para nuestras entidades con ADO.NET
- Definiendo tests de integración para nuestros repositorios ADO.NET
- Implementando repositorios CRUD para nuestras entidades con Entity Framework
- ¿Cómo definir relaciones con Fluent API en Entity Framework?
- ¿Cómo especificar el tamaño de nuestros campos con Fluent API en Entity Framework?
- ¿Cómo se definen dos Primary Keys para tablas intermedias en Entity Framework?
- ¿Cómo se realizan las migraciones en Entity Framework?
- ¿Cómo añadir datos por defecto en nuestras tablas con Entity Framework?
- Definiendo tests de integración para nuestros repositorios Entity Framework
Configuración Servicios
- Cómo crear Servicio Logger para almacenar excepciones en la base de datos
- Cómo crear un Servicio para encriptar contraseñas con hashing y salting
- Definiendo las interfaces de nuestros Mappers
Configuración UI
- ¿Qué es y para qué sirve el IServiceCollection?
- Extendiendo IServiceCollection para incorporar la configuración de las otras capas al proyecto MVC
- ¿Qué son los Environments y cómo configurar un nuevo environment?
- ¿Cómo acceder al Environment antes de builder.Build() para configurar los servicios?
- ¿Qué es el patrón MVC?
- Entendiendo el flujo de una petición en MVC
- ¿Cómo funciona el routing, mapear rutas y añadir rutas personalizadas en nuestro controlador?
- ¿Qué son los «Layout», para qué sirven y cómo crearlos?
- ¿Qué son las secciones y para qué sirven?
- ¿Qué son las PartialViews y en qué se diferencian de las Views?
- ¿Qué son y cuál es la diferencia entre ViewBag, ViewData y TempData?
- Creando un sistema de notificaciones interno con TempData y PartialViews
Blog
- ¿Cuál es la diferencia entre UseAuthorization y UseAuthentication?
- Configuración del Program.cs para la autenticación por Cookies
- ¿Qué es un Data Transfer Object (DTO)?
- ¿Qué es y para qué sirven el ModelBinding, DataAnnotations y los ViewModels?
- Implementando el LoginController usando ModelBinding con WriterVM
- Procesando y validando el inicio de sesión de nuestros usuarios
- Definiendo tests de integración para nuestro LoginController
Despliegue
Ideas para futuras versiones
☐ Crear un sistema para que los lectores puedan suscribirse y recibir newsletters.
☐ Añadir la posibilidad de que los lectores dejen comentarios.