CodeGen - Deklarativní Aplikační Továrna
CodeGen není jen další generátor kódu. Je to jádro naší softwarové továrny, které transformuje jednoduché, čitelné definice doménových entit na plně funkční, robustní a konzistentní vertikální řezy aplikace.
Naší hlavní filozofií je "Single Source of Truth" (Jeden zdroj pravdy). Tímto zdrojem je doménová entita. Vše ostatní – datové přenosové objekty (DTOs), aplikační logika, rozhraní pro databázi a pravidla autorizace – je pouze odvozenou implementací.
Místo toho, abychom říkali systému, jak má postavit CRUD operace, my mu jen deklarujeme, co od něj chceme, pomocí sady jednoduchých a mocných C# atributů.
Klíčové Funkce a Atributy
Náš CodeGen nástroj je postaven na čtyřech hlavních pilířích, které jsou řízeny atributy přímo v doménových entitách:
1. Automatické Generování DTO a Mapování ([GenerateDto])
Problém: Ruční psaní DTO objektů pro Create, Update a Read operace je repetitivní, náchylné k chybám a představuje noční můru při údržbě. Pokaždé, když změníte entitu, musíte ručně aktualizovat několik DTO a mapovací logiku.
Naše řešení: Atribut [GenerateDto] automatizuje celý tento proces.
[GenerateDto(Purpose = DtoPurpose.Read)]
[GenerateDto(Purpose = DtoPurpose.Create, ExcludeProperties = ["Id", "UserId"])]
[GenerateDto(Purpose = DtoPurpose.Update, IncludeProperties = ["Name", "Description", "DueDate"])]
public partial record Project { ... }
Co CodeGen udělá:
- Vygeneruje DTO: Vytvoří
ProjectDto.g.cs,ProjectCreateDto.g.csaProjectUpdateDto.g.csa umístí je do sdíleného projektu (TodoApp.Shared). - Vygeneruje Mapování: Vytvoří
ProjectMappings.g.csvTodoApp.Cores extension metodami jakoToProjectDto(), které zajišťují bezchybné a konzistentní mapování mezi entitou a DTO.
2. Generování CQRS Handlerů ([GenerateCrudHandlers])
Problém: Psaní MediatR handlerů pro základní Create, Read, Update, Delete operace je čistý boilerplate. Kód je v 90 % případů identický, liší se jen v názvech typů.
Naše řešení: Atribut [GenerateCrudHandlers] vytvoří kompletní, robustní implementaci CQRS pipeline.
[GenerateCrudHandlers(Operations = CrudOperations.Read | CrudOperations.Create | CrudOperations.Update | CrudOperations.Delete)]
public partial record Todo { ... }
Co CodeGen udělá:
- Vygeneruje Commandy a Query: Vytvoří soubory jako
CreateTodoCommand.g.csaGetTodoByIdQuery.g.cs. - Vygeneruje Handlery: Vytvoří kompletní implementace handlerů, jako je
CreateTodoCommandHandler.g.cs, které obsahují veškerou potřebnou logiku: volání repozitáře, volání autorizace a publikování doménových eventů. - Vygeneruje Doménové Eventy: Vytvoří eventy jako
TodoCreatedEvent.g.csaTodoUpdatedEvent.g.cs, které signalizují změny v systému a umožňují napojení další logiky (např. Elsa workflows).
3. Generování Databázových Rozhraní ([IncludeRepositoryInterface])
Problém: Každá entita potřebuje své specifické rozhraní pro přístup k datům.
Naše řešení: Atribut [IncludeRepositoryInterface] se postará o vytvoření konzistentních IRepository a IReadRepository rozhraní.
[IncludeRepositoryInterface(typeof(ITodoSpecificReadRepository))]
public partial record Todo { ... }
Co CodeGen udělá:
- Vygeneruje
ITodoRepository.g.csaITodoReadRepository.g.cs. - Tato rozhraní automaticky dědí z generických
IRepository<T>aIReadRepository<T>a zároveň zahrnou jakékoli vámi definované specifické rozhraní, čímž poskytují silnou typovou kontrolu a rozšiřitelnost.
4. Deklarativní Autorizace ([Ownership] & [AuthorizeOperation])
Problém: Autorizační logika je často rozptýlená po celé aplikaci, těžko se testuje a ještě hůře se v ní audituje, kdo má k čemu přístup.
Naše řešení: Definujeme pravidla přímo na entitě.
[Ownership("UserId")]
[AuthorizeOperation(CrudOperations.Update, Policy = AuthorizationPolicy.OwnerOnly)]
[AuthorizeOperation(CrudOperations.Delete, Roles = "Admin", Policy = AuthorizationPolicy.OwnerOnly)]
public partial record Project { ... }
Co CodeGen udělá:
- Vygeneruje Autorizační Extension Metody: Vytvoří soubor
ProjectAuthorizationExtensions.g.cs, který obsahuje logiku pro každou operaci (např.AuthorizeProjectUpdate). - Propojí Handlery: Automaticky vloží volání těchto autorizačních metod do vygenerovaných MediatR handlerů.
- Výsledek: Autorizace je centralizovaná, snadno čitelná přímo z definice entity a 100% konzistentně aplikovaná v celé aplikaci.
Pracovní Postup s CodeGen
- Definuj: Vývojář vytvoří nebo upraví jednoduchý
partial recordvTodoApp.Core.Domain.Entities. - Deklaruj: Ozdobí entitu našimi atributy, čímž popíše její chování.
- Generuj: Spustí jeden PowerShell skript:
./generate-dtos.ps1. - Hotovo: Nástroj
CodeGense postará o zbytek a vygeneruje desítky souborů napříčCoreaSharedprojekty. Vývojář se může okamžitě soustředit na implementaci unikátní byznys logiky.
Tímto přístupem nejenže zrychlujeme vývoj o stovky procent, ale také vytváříme systémy, které jsou robustnější, bezpečnější a radost je udržovat. Je to základní kámen naší cesty k plně autonomnímu vývoji softwaru.