Una carnicería no vende piezas: vende kilos.
El producto se vende por peso, llega como animal entero y muchas veces se fía a clientes de confianza. Con una libreta o un punto de venta genérico es difícil saber cuánto queda de cada corte, cuánto debe cada cliente y si la caja cuadra al cerrar el turno.
Clean Architecture, de afuera hacia adentro.
La API está dividida en cuatro proyectos y las dependencias apuntan hacia el dominio. Las reglas del negocio no saben nada de la base de datos ni de HTTP.
CarniApp.ApiControladores, JWT, autorización por permisos y Swagger
CarniApp.InfrastructureEF Core con SQL Server, repositorios, UnitOfWork y BCrypt
CarniApp.ApplicationCasos de uso por módulo, DTOs y reglas del negocio
CarniApp.DomainEntidades: venta, corte, lote de animal, cliente, usuario, rol
Cada capa depende solo de las que están más adentro; el dominio no depende de nada.
La base de datos no usa migraciones de EF: el esquema vive en scripts T-SQL escritos a mano e idempotentes. Una prueba, SchemaContractTests, falla si una entidad usa una columna que los scripts no crean.