Principios Fundamentales de Clean Architecture
Clean Architecture establece una separación clara de responsabilidades mediante un diseño estratificado que otorga a las aplicaciones mayor mantenibilidad, capacidad de prueba y flexibilidad. BlazorHero implementa rigurosamente este patrón arquitectónico, organizando el sistema en capas definidas:
- Capa de Presantación: Gestiona la interfaz de usuario y las interacciones del usuario
- Capa de Aplicación: Orchestral el comportamiento de la aplicación, conteniendo la lógica de negocio
- Capa de Dominio: Alberga las entidades de negocio y las reglas de negocio esenciales
- Capa de Infraestructura: Proporciona las implementaciones técnicas específicas
Esta estructura garantiza la desconexión entre la lógica de negocio y la implementación técnica, resultando en aplicaciones más robustas y expandibles.
Implementación de la Arquitectura en BlazorHero
Diseño de la Capa de Dominio
La capa de dominio constituye el núcleo de la aplicación, conteniendo las entidades y reglas de negocio. En BlazorHero, esta capa se encuentra en el directorio src/Domain, definiendo entidades como Categoria, Articulo y estableciendo interfaces para los comportamientos básicos de las entidades:
public interface IEntidad<tidentificador>
{
TIdentificador Identificador { get; set; }
}
</tidentificador>
Las entidades de dominio, como Articulo.cs, están localizadas en el directorio src/Domain/Entidades/Catalogo/, incorporando los atributos fundamentales y las reglas de negocio del dominio.
Implementación de la Capa de Aplicación
La capa de aplicación reside en el directorio src/Application y comprende los casos de uso y servicios de aplicación, coordinando la capa de dominio con la capa de infraestructura. Esta capa define interfaces para repositorios mediante abstracciones como:
public interface IRepositorioArticulo
{
Task<Articulo> ObtenerPorIdAsync(int id);
Task<IEnumerable<Articulo>> ListarTodosAsync();
Task<Articulo> AgregarAsync(Articulo articulo);
Task ActualizarAsync(Articulo articulo);
Task EliminarAsync(int id);
}
Estas interfaces se definen en la capa de aplicación pero se implementan en la capa de infraestructura, respetando el principio de inversión de dependencias.
Implementación de la Capa de Infraestructura
La capa de infraestructura, ubicada en el directorio src/Infrastructure, proporciona las implementaciones técnicas concretas, como el acceso a bases de datos y el almacenamiento de archivos. Por ejemplo, RepositorioArticulo.cs implementa la interfaz IRepositorioArticulo, proporcionando la lógica concreta de acceso a los datos de artículos.
Implementación de la Capa de Presentación
La capa de presentación comprende la aplicación cliente Blazor y los controladores API. El cliente Blazor se encuentra en el directorio src/Client, utilizando componentes MudBlazor para construir la interfaz de usuario. Los controladores API están ubicados en el directorio src/Server/Controllers, como ArticulosController:
public class ArticulosController : ControladorBaseApi<ArticulosController>
{
private readonly IMediator _mediator;
public ArticulosController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<ArticuloDto>>> ObtenerTodos()
{
return Ok(await _mediator.Send(new ListarArtigosQuery()));
}
}
Inyección de Dependencias y Configuración de Servicios
BlazorHero aprovecha extensivamente la inyeccción de dependencias (DI) para lograr el desacoplamiento entre capas. En el archivo src/Application/Extensiones/ExtensionesColeccionServicios.cs se configuran los servicios de la aplicación:
public static class ExtensionesColeccionServicios
{
public static IServiceCollection AgregarCapaAplicacion(this IServiceCollection servicios)
{
servicios.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(ExtensionesColeccionServicios).Assembly));
servicios.AddValidatorsFromAssembly(typeof(ExtensionesColeccionServicios).Assembly);
return servicios;
}
}
Esta configuración clarifica las dependencias entre capas, facilitando las pruebas y el mantenimiento.
Mejores Prácticas en Desarrollo Real
Aplicación del Patrón Repositorio
BlazorHero utiliza ampliamente el patrón repositorio, definiendo operaciones genéricas de acceso a datos mediante la interfaz IRepositorioAsync:
public interface IRepositorioAsync<T, in TIdentificador> where T : class, IEntidad<TIdentificador>
{
Task<T> ObtenerPorIdAsync(TIdentificador identificador);
Task<List<T>> ObtenerTodosAsync();
Task<T> AgregarAsync(T entidad);
Task ActualizarAsync(T entidad);
Task EliminarAsync(TIdentificador identificador);
}
Este diseño centraliza la lógica de acceso a datos, mejorando la mantenibilidad y la capacidad de prueba del código.
Aplicación del Diseño Guiado por el Dominio
En el directorio src/Domain/Contratos, se definen interfaces como IEntidadAuditable, proporcionando funcionalidad de auditoría para las entidades:
public interface IEntidadAuditable
{
DateTime FechaCreacion { get; set; }
string CreadoPor { get; set; }
DateTime? FechaUltimaModificacion { get; set; }
string? ModificadoPor { get; set; }
}
Este diseño抽象a las funcionalidades comunes en interfaces, permitiendo agregar capacidades a las entidades mediante su implementación, demostrando los principios del Diseño Guiado por el Dominio.
Iniciando con BlazorHero
Para comenzar a utilizar BlazorHero, el primer paso consiste en clonar el repositorio:
git clone https://github.com/blazorhero/blazorhero
Posterior a esto, se debe seguir la documentación del proyecto para realizar la configuración necesaria. La estructura estratificada de BlazorHero permite a los desarrolladores concentrarse en la lógica de negocio sin necesidad de preocuparse excesivamente por los detalles técnicos de implementación.
Conclusión
BlazorHero, mediante la implementación de Clean Architecture, proporciona una base arquitectónica sólida y mantenible para aplicaciones Blazor WebAssembly. Su diseño estratificado claramente definido, la aplicación extensiva de inyección de dependencias y las prácticas de Diseño Guiado por el Dominio simplifican el desarrollo de aplicaciones Blazor complejas. Tanto desarrolladores novatos como experimentados pueden beneficiarse de la arquitectura de BlazorHero para construir aplicaciones Blazor de alta calidad.
El estudio y aplicación de los conceptso arquitectónicos de BlazorHero permite a los desarrolladores mejorar sus habilidades en diseño arquitectónico, estableciendo bases sólidas para futuros proyectos Blazor.