dotnet-clean-architecture
Skill0 starsChanged 4 months agoMITView on GitHub
Genera backend .NET Clean Architecture con estas convenciones — 10 proyectos, Dapper + stored procedures (sin EF), DTOs por operación CRUD, ApiResponse unificado, IDs encriptados, IValidatorService centralizado, auditoría desde JWT, y pruebas unitarias (xUnit v3 + NSubstitute) y de integración contra una BD de pruebas. Úsala para crear un API .NET, un CRUD de entidad nuevo o sus pruebas siguiendo estas convenciones.
4 other projects use a version of this.
Adopted by
Most recently taken up by
- Ayoub-EDAHLOULI/dotnet-clean-architecture-skilltheir own version, first seen Oct 20, 2026
- orrrrli/clawd-harnesstheir own version, first seen Oct 20, 2026
- orrrrli/ai-engineering-stacktheir own version, first seen Oct 11, 2026
- ronnythedev/dotnet-clean-architecture-skillstheir own version, first seen May 20, 2026
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- ronnythedev/dotnet-clean-architecture-skills★ 73same name
- orrrrli/ai-engineering-stack★ 2same name
- orrrrli/clawd-harness★ 2same name
- Ayoub-EDAHLOULI/dotnet-clean-architecture-skill★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 71
No asumas ninguna — son obligatorias antes de crear cualquier archivo.
- Very specific: line 172
estado(ostatusen inglés) en Update: no es parámetro ni del SP ni del Service por defecto — se preserva.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
.NET Clean Architecture
⚠️ Skill personal, no genérica de Clean Architecture. No aplicar a proyectos que no sigan este estilo.
Basada en un backend .NET real, revisado a fondo el 2026-07-18 leyendo directamente el código fuente. Ante conflicto entre esta skill y tu código real, gana el código real.
Motor
- .NET, Clean Architecture, sin Entity Framework — solo Dapper +
Stored Procedures (ver skill
sql-database-patternspara el lado BD). - 10 proyectos en una sola solución, agrupados en 5 capas (Solution Folders
virtuales, no carpetas físicas — ver
references/project-structure.md). - Entidades agrupadas por carpeta de negocio — ver skill
business-domain-groupingpara el mapeo esquema↔carpeta.
Decisiones persistentes entre sesiones
Antes de "Antes de crear", verifica si existe .claude/skill-decisions.md
en el proyecto:
- Sección
## Transversal→ si ya tiene "Idioma de nomenclatura", no la vuelvas a preguntar (es compartida consql-database-patternsyangular-feature-architecture— la fija la primera skill que se use en el proyecto). - Sección
## dotnet-clean-architecture→ si existe, léela y aplica esas decisiones (versión de .NET + prefijo) directamente. - Si ninguna existe todavía, es la primera vez en este proyecto: haz las preguntas obligatorias de abajo y crea/completa ambas secciones.
Es un archivo del proyecto que usa la skill (no de la skill en sí), para que una sesión nueva (otra terminal, otro IDE) continúe sobre lo ya decidido en vez de volver a preguntar todo como si fuera la primera vez. Formato:
## Transversal
- Idioma de nomenclatura: {español|inglés}
## dotnet-clean-architecture
- Versión de .NET: {versión}
- Prefijo: {Prefijo}
### Excepciones por entidad
- {Entidad}: {excepción puntual}Append-only: una excepción nueva se agrega a la lista, nunca se reescribe una decisión ya tomada salvo que el usuario pida explícitamente cambiarla.
Antes de crear (obligatorio)
Antes de generar una solución nueva, pregunta siempre:
- Versión de .NET — sugiere por defecto la última estable, pero pregunta si el usuario quiere esa u otra.
- Prefijo de nomenclatura de los proyectos (ej.
TuApp). - ¿Idioma de nomenclatura? (si no está ya fijado en
## Transversal) Español (default) o inglés — aplica a propiedades de Entity/DTOs, comentarios, y también asql-database-patterns/angular-feature-architecturesi se usan en el mismo proyecto. Detalle de equivalencias (AuditoriaBase) enreferences/project-structure.md.
No asumas ninguna — son obligatorias antes de crear cualquier archivo.
Workflow
- Siempre, antes de crear o tocar un Service: verifica que el proyecto tenga la prueba de arquitectura de
Services (
tests/{Prefijo}.UnitTests/Arquitectura/ServiciosSoloNegocioTests.cs, plantilla enreferences/testing.md). Si no existe, créala primero. Es lo que garantiza la regla "el Service solo tiene lógica de negocio y solo los métodos de su interfaz" en cualquier proyecto, la escriba quien la escriba. Antes de escribir el Service, lee el "Ejemplo de referencia: antes y después" dereferences/service-pattern.mdy reparte el código en sus cuatro archivos (Mensajes{Core},{Entidad}Mapeo,{Entidad}Helper, Service) con esa misma forma. Al terminar,dotnet testcon la prueba de arquitectura en verde. Igual para repositorios, controllers y servicios externos: la pruebaCapasSoloSuResponsabilidadTests(references/testing.md) y los helpers únicosSpEjecutor(references/repository-pattern.md),RespuestaHttp(references/controller-pattern.md) yJwtEmisor/JwtClaims(references/security-patterns.md), copiados tal cual, deben existir antes de escribir el primer repositorio, controller o adaptador. Y la pruebaValidatorPorCarpetaDeNegocioTestsantes del primer validador. - ¿API nueva desde cero? →
references/project-structure.md(10 proyectos,Program.cs, paquetes). - ¿CRUD de una entidad nueva? → sigue el checklist de abajo, un archivo por
capa:
references/domain-and-dtos.md,references/repository-pattern.md,references/service-pattern.md,references/mapper-pattern.md,references/controller-pattern.md. Usabusiness-domain-groupingpara decidir la carpeta{Core}. - ¿Validaciones o manejo de errores? →
references/validation-and-errors.md. - ¿IDs encriptados, passwords, o auth/JWT? →
references/security-patterns.md. - ¿Vas a instalar un paquete NuGet (nuevo, o un bump de versión mayor de
uno existente)? → skill
package-security-vettingantes dedotnet add package— obligatorio, salvo que ya esté en la tabla de paquetes dereferences/project-structure.md. - Siempre → nomenclatura y namespace único de
references/conventions.md. - Siempre, al terminar una funcionalidad → sus pruebas unitarias y de
integración:
references/testing.md. La funcionalidad no está terminada hasta que todas las pruebas de la solución están en verde.
Los 10 proyectos (5 capas)
| Capa | Proyectos |
| 10.Transversal | Common, Mapper, Logging, Security |
| 20.Domain | Domain |
| 30.Infraestructura | Infrastructure, Persistence |
| 40.Application | Application, Validator |
| 50.Presentation | WebApi |
Estas 5 capas son Solution Folders virtuales de Visual Studio (declaradas
en el .sln), no carpetas físicas — en disco los 10 proyectos viven planos
bajo src/{Prefijo}.{Proyecto}/. Receta exacta de cómo declarar los
Solution Folders en references/project-structure.md.
Flujo de dependencias: Domain ← Application ← {Persistence, Infrastructure,
Mapper, Validator, Logging} → WebApi. Detalle completo (contenido de cada
proyecto, DI, Program.cs, paquetes) en references/project-structure.md.
Reglas duras
- El Service solo expone los métodos que usa el controller (los de su interfaz: en un CRUD, exactamente
GetAllAsync,GetByIdAsync,InsertAsync,UpdateAsyncyDeleteAsync). Ningún otro método, ni privado: un paso de apoyo va en el helper estáticoApplication/Helpers/{Core}/{Entidad}Helper.cs, que recibe por parámetro lo que necesita (IUnitOfWork,IIdEncryptionService,IAppLogger<T>). - El Service solo tiene lógica de negocio. Validaciones, condicionales, flujos, transacciones e invocaciones
(repositorio, validador, Mapper, helpers, logger); nunca constantes, mensajes literales, tipos internos,
transformaciones de datos ni mecanismos. Mensajes en
Application/Common/Mensajes/Mensajes{Core}.cs; entidad → DTO de respuesta, árboles, páginas, filtros y JSON de SPs en el helper estáticoApplication/Helpers/{Core}/{Entidad}Mapeo.cs; DTO de entrada → entidad en AutoMapper. Detalle y tabla de "qué va dónde" y ejemplo completo antes/después enreferences/service-pattern.md. Se garantiza con la prueba de arquitectura obligatoria (Workflow, paso 0): si falla, se mueve el código a su lugar; nunca se relaja la prueba. - El repositorio (y el
UnitOfWork) solo tiene los métodos de su interfaz, y cada uno solo declara el SP y sus parámetros de negocio: el mecanismo (@error/@msg, ejecución,SpResult, ID generado, valores por defecto) va enPersistence/Helpers/SpEjecutor.cs; parámetros compartidos en{Entidad}Parametros. Únicos textos: el nombre del SP y de sus@parámetros. Ejemplo enreferences/repository-pattern.md. - El controller solo tiene endpoints del negocio: cada uno es
this.Responder(await _service.XAsync(...)); el model binding arma los DTOs ([FromRoute]en el Delete), los claims se leen con helpers deWebApi/Helpers/. Únicos textos: los de sus atributos. Ejemplo enreferences/controller-pattern.md. - El servicio externo (Security, Logging, Infrastructure,
WebApi/Services) solo tiene los métodos de su interfaz: pasos de apoyo enHelpers/, nombres de claims enApplication/Common/ClaimsSesion.cs, textos enApplication/Common/Mensajes/MensajesTecnicos.cs; sin textos literales. Ejemplo enreferences/security-patterns.md. - Estas tres reglas, como la del Service, se garantizan con una prueba de arquitectura obligatoria
(
CapasSoloSuResponsabilidadTests, Workflow paso 0); si falla, se mueve el código; nunca se relaja la prueba. - Validator por carpeta de negocio:
Validators/solo tiene validadores; las reglas reutilizables van enRules/{Core}/{Entidad o proceso}/, en la carpeta del negocio cuya lógica expresan (no la del consumidor ni la de la entidad que guarda el campo:PasswordRuleses deAuth), o enRules/Comun/si no tienen dueño de negocio. Lo garantiza la pruebaValidatorPorCarpetaDeNegocioTests. - Sin Entity Framework. Todo acceso a datos vía Dapper + Stored
Procedures (
Sp_{Accion}_{Entidad}con@error/@msgOUTPUT — ver skillsql-database-patterns). - Namespace único
{Prefijo}.Application.Interfacespara TODAS las interfaces (Repository/,Security/,Common/,Service/), sin importar la subcarpeta física. IUnitOfWorkcon propiedad lazy por repositorio:public IXRepository X => _x ??= new XRepository(_connection, () => _transaction);. Repos comparten conexión/transacción del UoW. Transacciones sync y async (BeginTransaction/BeginTransactionAsync, etc).IValidatorServicecentralizado — los Services inyectan un soloIValidatorService, nuncaIValidator<T>directamente.- Try/catch solo en la capa Service ("capturar en la frontera") — los repositorios dejan subir la excepción sin capturarla.
- Controller siempre:
if (!result.Success) return BadRequest(result); return Ok(result);— sin excepción, en los 5 endpoints CRUD. - Sin paginación — solo filtro vía
{Entidad}SelDto. - Auditoría desde JWT —
usuario_reg/usuario_act(ocreated_by/updated_bysi el proyecto decidió inglés) nunca vienen del DTO; el Service los asigna desdeICurrentUserService.Username. estado(ostatusen inglés) en Update: no es parámetro ni del SP ni del Service por defecto — se preserva. SoloDeletelo cambia a0/false.- IDs siempre encriptados al cliente (
IIdEncryptionService) — Domain, Repository y BD siguen usandoint. Nunca crear métodos privadosEncryptNullableIden un Service — usar la extensiónEncryptNullable. - Una entidad = un Service/Controller/Repository propio — nunca mezclar
métodos de distintas entidades (aplica a entidades principales, tablas de
referencia, y tablas junction). Excepción: un Service puede orquestar
varias entidades en una transacción vía
IUnitOfWork, pero los GET de las entidades auxiliares van en sus propios controllers. Solo se mezcla si el usuario lo pide explícitamente. - AutoMapper con
MemberList.Source, perfiles registrados manualmente enMapper/DependencyInjection.cs— no hay auto-scan.Mapper/Profiles/es plano por entidad (única excepción a la agrupación por core).Mapper/Resolvers/paraIMemberValueResolverreutilizables (ej. desencriptar un ID directamente en el mapeo). - Logging:
AddAppLogging()— nuncaAddLogging()(conflictúa con el built-in de Microsoft). - Comentario de una línea por método (Repository/Application/
Infrastructure) explicando qué hace, en el idioma decidido (ver
.claude/skill-decisions.md, español por defecto). Excepción: un proceso de Application largo, no-CRUD, con verificaciones o pasos extra, lleva un comentario más extenso (mínimo 2, máximo 6 líneas) explicando el caso práctico y la secuencia — directo, sin relleno, solo más largo. - Transacción
UnitOfWorkobligatoria cuando un método de Application ejecuta más de un paso todo-o-nada (ej. crear A y B donde ambos deben existir o ninguno). Patrón completo enreferences/service-pattern.md. - Presentation: sufijo por defecto
WebApi, salvo que el usuario pida explícitamente otro nombre. - Agrupación por carpeta de negocio (
{Core}) en Persistence, Application (Services/DTOs/Interfaces), y Validator — ver skillbusiness-domain-grouping. - Pruebas obligatorias (
references/testing.md): toda funcionalidad se entrega con pruebas unitarias (Services y validadores, dependencias simuladas) y de integración (API en memoria contra una BD de pruebas recreada con los scripts del repo). Cada validación del SP se provoca con un request real y se verifica su mensaje exacto. Nada se da por terminado ni se sube con una prueba en rojo; una prueba en rojo se corrige arreglando el código, no la prueba.
Checklist: agregar un CRUD de entidad nueva
{Core} = carpeta de negocio (ver skill business-domain-grouping).
Domain/Entities/{Core}/{Entidad}.csheredandoAuditoriaBase—references/domain-and-dtos.md.Application/DTOs/{Core}/{Entidad}/— Ins/Upd/Del/Sel/Response —references/domain-and-dtos.md.Application/Interfaces/Repository/{Core}/I{Entidad}Repository.cs(namespace único) —references/repository-pattern.md.Application/Interfaces/Service/{Core}/I{Entidad}Service.cs(namespace único) —references/service-pattern.md.Persistence/Repositories/{Core}/{Entidad}Repository.cs—references/repository-pattern.md(cada método:SpEjecutor.Parametros()+ parámetros de negocio + una llamada aSpEjecutor).- Agregar propiedad a
IUnitOfWorky su lazy-init enUnitOfWork—references/repository-pattern.md. Validator/Validators/{Core}/{Entidad}/— un validador por DTO; reglas que comparten dos o más validadores enValidator/Rules/{Core}/{Entidad o proceso}/(carpeta del negocio cuya lógica expresan) —references/validation-and-errors.md.Mapper/Profiles/{Entidad}Profile.cs(plano, sin{Core}) + registrar enMapper/DependencyInjection.cs—references/mapper-pattern.md.Application/Services/{Core}/{Entidad}Service.cs(solo lógica de negocio) + sus mensajes enApplication/Common/Mensajes/Mensajes{Core}.cs+ su helperApplication/Helpers/{Core}/{Entidad}Mapeo.cs—references/service-pattern.md.- Registrar
I{Entidad}ServiceenApplication/DependencyInjection.cs—references/service-pattern.md. WebApi/Controllers/{Entidad}sController.cscon[Authorize]—references/controller-pattern.md(cada endpoint:this.Responder(await ...); Delete con[FromRoute] {Entidad}DelDto).- Pruebas:
tests/{Prefijo}.UnitTests/Application/Services/{Core}/{Entidad}ServiceTests.cs,tests/{Prefijo}.UnitTests/Validator/{Core}/{Entidad}/ytests/{Prefijo}.IntegrationTests/Api/{Core}/{Entidad}/{Entidad}sApiTests.cs;dotnet testen verde, incluida la prueba de arquitectura de Services —references/testing.md.
Referencias
references/project-structure.md— 10 proyectos, Solution Folders, DI,Program.cs, paquetes NuGet.references/domain-and-dtos.md— Entity (Domain) + los 5 DTOs.references/repository-pattern.md— Interfaz + Repository (Dapper) + registro enIUnitOfWork.references/service-pattern.md— Service completo + transacción multi-paso.references/mapper-pattern.md— Profile + Resolver + registro enDependencyInjection.references/controller-pattern.md— Controller (patrón de 5 endpoints).references/validation-and-errors.md— FluentValidation,IValidatorService,SpResult/ApiResponse, try/catch.references/security-patterns.md— IDs encriptados, hashing de passwords, JWT, auditoría desde JWT.references/conventions.md— nomenclatura, namespace único, regla de una entidad por Service/Controller/Repository.references/testing.md— proyectos de prueba unitaria e integración, BD de pruebas, qué se prueba por CRUD, trazabilidad.- Skill
business-domain-grouping— mapeo esquema↔carpeta de negocio ({Core}). - Skill
package-security-vetting— chequeo de seguridad obligatorio antes de instalar cualquier paquete NuGet fuera de la tabla de defaults.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

