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 CreateUpdate 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.csProjectCreateDto.g.cs a ProjectUpdateDto.g.cs a umístí je do sdíleného projektu (TodoApp.Shared).
  • Vygeneruje Mapování: Vytvoří ProjectMappings.g.cs v TodoApp.Core s extension metodami jako ToProjectDto(), 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.cs a GetTodoByIdQuery.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.cs a TodoUpdatedEvent.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.cs a ITodoReadRepository.g.cs.
  • Tato rozhraní automaticky dědí z generických IRepository<T> a IReadRepository<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

  1. Definuj: Vývojář vytvoří nebo upraví jednoduchý partial record v TodoApp.Core.Domain.Entities.
  2. Deklaruj: Ozdobí entitu našimi atributy, čímž popíše její chování.
  3. Generuj: Spustí jeden PowerShell skript: ./generate-dtos.ps1.
  4. Hotovo: Nástroj CodeGen se postará o zbytek a vygeneruje desítky souborů napříč Core a Shared projekty. 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.

Subscribe to Blog

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe