Cómo crear una aplicación completa con .NET 10, C# 14 y Arquitectura Limpia desde cero

Cómo crear una aplicación completa con .NET 10, C# 14 y arquitectura limpia desde cero

El desarrollo de software empresarial moderno exige aplicaciones escalables, mantenibles y preparadas para evolucionar con el tiempo. Con la llegada de .NET 10 y C# 14, los desarrolladores cuentan con herramientas más potentes para construir soluciones robustas siguiendo principios de diseño sólidos. Una de las metodologías más recomendadas actualmente es la Arquitectura Limpia (Clean Architecture), un enfoque que separa responsabilidades y reduce el acoplamiento entre componentes.

En este artículo aprenderás cómo crear una aplicación completa desde cero utilizando .NET 10, C# 14 y Arquitectura Limpia.

¿Qué es la Arquitectura Limpia?

La Arquitectura Limpia fue propuesta por Robert C. Martin (Uncle Bob) y se basa en una idea fundamental: las reglas de negocio no deben depender de frameworks, bases de datos ni interfaces de usuario.

Su estructura suele dividirse en varias capas:

  • Domain: Contiene entidades, reglas de negocio y contratos.
  • Application: Implementa casos de uso y lógica de aplicación.
  • Infrastructure: Gestiona acceso a datos, servicios externos y repositorios.
  • Presentation: Expone la aplicación mediante APIs, aplicaciones web o interfaces gráficas.

Esta separación facilita las pruebas unitarias, mejora la mantenibilidad y permite reemplazar tecnologías sin afectar la lógica principal.

Paso 1: Crear la solución

Lo primero es generar una solución vacía utilizando la CLI de .NET:

dotnet new sln -n CleanArchitectureApp

Posteriormente se crean los proyectos principales:

dotnet new classlib -n CleanArchitectureApp.Domain
dotnet new classlib -n CleanArchitectureApp.Application
dotnet new classlib -n CleanArchitectureApp.Infrastructure
dotnet new webapi -n CleanArchitectureApp.API

Finalmente se agregan a la solución:

dotnet sln add **/*.csproj

Con esta estructura se establece una base sólida para el crecimiento futuro de la aplicación.

Paso 2: Diseñar la capa Domain

La capa Domain representa el corazón del sistema.

Por ejemplo, si estamos desarrollando una aplicación de gestión de clientes, podríamos crear la entidad:

public class Customer
{
    public Guid Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
}

Además, se definen interfaces que describen comportamientos sin depender de implementaciones concretas:

public interface ICustomerRepository
{
    Task<Customer?> GetByIdAsync(Guid id);
    Task AddAsync(Customer customer);
}

La ventaja es que la lógica de negocio permanece independiente de cualquier base de datos.

Paso 3: Implementar los casos de uso

En la capa Application se desarrollan los casos de uso.

Por ejemplo:

public class CreateCustomerCommand
{
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
}

Y su correspondiente manejador:

public class CreateCustomerHandler
{
    private readonly ICustomerRepository _repository;

    public CreateCustomerHandler(ICustomerRepository repository)
    {
        _repository = repository;
    }

    public async Task Handle(CreateCustomerCommand command)
    {
        var customer = new Customer
        {
            Id = Guid.NewGuid(),
            Name = command.Name,
            Email = command.Email
        };

        await _repository.AddAsync(customer);
    }
}

Esta capa coordina la ejecución de la lógica empresarial sin preocuparse por detalles técnicos.

Paso 4: Configurar Infrastructure

La capa Infrastructure implementa las interfaces definidas en Domain.

Usando Entity Framework Core:

public class CustomerRepository : ICustomerRepository
{
    private readonly AppDbContext _context;

    public CustomerRepository(AppDbContext context)
    {
        _context = context;
    }

    public async Task AddAsync(Customer customer)
    {
        await _context.Customers.AddAsync(customer);
        await _context.SaveChangesAsync();
    }

    public async Task<Customer?> GetByIdAsync(Guid id)
    {
        return await _context.Customers.FindAsync(id);
    }
}

Aquí también se configuran servicios externos, sistemas de mensajería, caché y almacenamiento.

Paso 5: Crear la API

La capa Presentation expone la funcionalidad al mundo exterior.

Un controlador básico podría verse así:

[ApiController]
[Route("api/customers")]
public class CustomersController : ControllerBase
{
    private readonly CreateCustomerHandler _handler;

    public CustomersController(CreateCustomerHandler handler)
    {
        _handler = handler;
    }

    [HttpPost]
    public async Task<IActionResult> Create(CreateCustomerCommand command)
    {
        await _handler.Handle(command);
        return Ok();
    }
}

Gracias a la inyección de dependencias, la API solo consume servicios sin conocer los detalles internos.

Paso 6: Aprovechar las novedades de .NET 10 y C# 14

.NET 10 continúa mejorando el rendimiento, la productividad y la compatibilidad multiplataforma. Junto con C# 14, ofrece optimizaciones en compilación, mejor manejo de colecciones, patrones más expresivos y características que reducen la cantidad de código repetitivo.

Estas mejoras permiten desarrollar aplicaciones más rápidas y fáciles de mantener, especialmente en entornos empresariales donde el rendimiento y la escalabilidad son fundamentales.

Buenas prácticas recomendadas

Para obtener el máximo beneficio de la Arquitectura Limpia es recomendable:

  • Mantener las dependencias apuntando siempre hacia el núcleo del dominio.
  • Utilizar inyección de dependencias en toda la solución.
  • Implementar pruebas unitarias para casos de uso críticos.
  • Aplicar CQRS cuando la complejidad del proyecto lo requiera.
  • Centralizar validaciones y manejo de excepciones.
  • Utilizar Entity Framework Core únicamente en Infrastructure.
  • Documentar la API mediante Swagger/OpenAPI.

Crear una aplicación con .NET 10, C# 14 y Arquitectura Limpia permite desarrollar soluciones modernas, escalables y preparadas para crecer a largo plazo. La separación clara de responsabilidades facilita el mantenimiento, mejora las pruebas y reduce el impacto de los cambios tecnológicos futuros. Al combinar las capacidades más recientes del ecosistema .NET con una arquitectura sólida, las organizaciones pueden construir aplicaciones empresariales más robustas, eficientes y sostenibles en el tiempo.

Accede a mis cursos profesionales con descuento en Udemy:
https://render2web.com/promociones/

Te puede interesar...

Deja un comentario