Skip to content

Commit 0bffd84

Browse files
committed
Update solution structure and add docs for RoyalCode
Modernize solution, bump versions, and add Portuguese docs for domain, workcontext, and Copilot usage. Solution and Documentation Modernization -- Renamed solution file to EnterprisePatterns.sln and updated structure. -- Added .docs folder to solution items with markdown documentation. -- Included documentation files: domain.md, workcontext.md, instructions-for-copilot.md. Library Version Updates -- Bumped PersistVer from 0.8.8 to 0.8.9 and SearchVer from 0.9.1 to 0.10.0 in Directory.Build.props. Developer and Copilot Guidance -- Added comprehensive Portuguese documentation for domain modeling, workcontext usage, and Copilot code generation. -- Documentation covers setup, best practices, anti-patterns, and troubleshooting. No Runtime or API Changes -- No changes to source code or library APIs; updates are limited to solution/project structure and documentation.
1 parent 80ae524 commit 0bffd84

6 files changed

Lines changed: 556 additions & 3 deletions

File tree

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# RoyalCode Enterprise Patterns – Domínio (Entities e Aggregates)
2+
3+
Este documento descreve as bibliotecas de domínio e foca em como modelar entidades e agregados, separando o conteúdo de persistência (WorkContext/UnitOfWork/Repositories), que está documentado em `.docs/workcontext.md`.
4+
5+
Escopo:
6+
- `RoyalCode.Entities`
7+
- `RoyalCode.Aggregates`
8+
9+
Compatibilidade: múltiplos targets (.NET 8, .NET 9 e .NET 10) via `$(LibTargets)`.
10+
11+
---
12+
13+
## RoyalCode.Entities
14+
15+
Fundação para modelagem de entidades. Fornece contratos e implementações básicas para ID, Code, Guid, estado ativo e exclusão lógica.
16+
17+
Principais tipos
18+
- `IEntity` / `IEntity<TId>`: marca uma entidade e o tipo do seu identificador.
19+
- `Entity<TId>`: base com propriedade `Id` (set protegido).
20+
- `Entity<TId, TCode>`: base com `Id` e `Code`.
21+
- `IHasId<TId>`: expõe `Id` para entidades/DTOs.
22+
- `IHasCode<TCode>`: expõe `Code` (identificador amigável e único, distinto do ID).
23+
- `IHasGuid`: expõe `Guid` global (não substitui o ID; útil para referência cruzada entre bancos/contextos).
24+
- `IActiveState`: expõe `IsActive` para habilitar/desabilitar sem deletar.
25+
- `ISoftDeletable`: expõe `IsDeleted` para exclusão lógica.
26+
27+
Referência rápida de API (como Copilot deve sugerir)
28+
- Criar entidade: `public class Product : Entity<Guid> { /* propriedades */ }`
29+
- Criar DTO associado: `public class ProductDto : IHasId<Guid> { public Guid Id {get;set;} /* ... */ }`
30+
- Entidade com código: `public class Sku : Entity<int, string> { /* Code já incluído */ }`
31+
32+
Quando usar
33+
- Herde de `Entity<TId>` para qualquer entidade de domínio com ID.
34+
- Use `Entity<TId, TCode>` quando existir também um código de negócio único.
35+
- Implemente `IHasGuid`, `IActiveState` e/ou `ISoftDeletable` conforme os requisitos do domínio.
36+
37+
Exemplo básico
38+
```csharp
39+
using RoyalCode.Entities;
40+
41+
public class Person : Entity<int>
42+
{
43+
public string Name { get; set; } = null!;
44+
}
45+
```
46+
47+
Exemplo com `Entity<TId, TCode>`
48+
```csharp
49+
using RoyalCode.Entities;
50+
51+
public class CatalogItem : Entity<Guid, string>
52+
{
53+
public string Name { get; set; } = null!;
54+
// Code é herdado e tem set protegido
55+
public CatalogItem(Guid id, string code, string name)
56+
{
57+
Id = id;
58+
Code = code;
59+
Name = name;
60+
}
61+
}
62+
```
63+
64+
---
65+
66+
## RoyalCode.Aggregates
67+
68+
Modelagem de Agregados (DDD). Define a raiz do agregado e integra a coleta de eventos de domínio.
69+
70+
Principais tipos
71+
- `IAggregateRoot` / `IAggregateRoot<TId>`: marca a raiz do agregado e o tipo do ID.
72+
- `AggregateRoot<TId>`: base que herda de `Entity<TId>` e inclui `IDomainEventCollection? DomainEvents` + método protegido `AddEvent(IDomainEvent)`.
73+
- `AggregateRoot<TId, TCode>`: versão com `Code` além do ID e dos eventos.
74+
75+
Eventos de domínio
76+
- `AggregateRoot<TId>` mantém uma coleção de eventos (`DomainEvents`).
77+
- Use `AddEvent(evt)` para registrar eventos quando invariantes do agregado forem alteradas.
78+
- O despacho/persistência de eventos é responsabilidade das bibliotecas de infraestrutura; aqui apenas coletamos os eventos.
79+
80+
Exemplo
81+
```csharp
82+
using RoyalCode.Aggregates;
83+
using RoyalCode.DomainEvents; // IDomainEvent
84+
85+
public sealed class Order : AggregateRoot<Guid>
86+
{
87+
public string Number { get; private set; }
88+
89+
public Order(string number)
90+
{
91+
Id = Guid.NewGuid();
92+
Number = number;
93+
AddEvent(new OrderCreated(Id, Number));
94+
}
95+
}
96+
97+
public record OrderCreated(Guid OrderId, string Number) : IDomainEvent;
98+
```
99+
100+
Exemplo com `AggregateRoot<TId, TCode>`
101+
```csharp
102+
using RoyalCode.Aggregates;
103+
using RoyalCode.DomainEvents;
104+
105+
public sealed class ProductAggregate : AggregateRoot<Guid, string>
106+
{
107+
public string Name { get; private set; }
108+
109+
public ProductAggregate(string code, string name)
110+
{
111+
Id = Guid.NewGuid();
112+
Code = code;
113+
Name = name;
114+
AddEvent(new ProductCreated(Id, Code));
115+
}
116+
}
117+
118+
public record ProductCreated(Guid ProductId, string Code) : IDomainEvent;
119+
```
120+
121+
---
122+
123+
## Boas práticas de modelagem
124+
- Mantenha invariantes do agregado dentro da raiz (`AggregateRoot`) e dispare eventos com `AddEvent` após mudanças significativas.
125+
- Não exponha `set` público para `Id`/`Code`; proteja modificações via comportamentos.
126+
- Utilize `IHasGuid` quando precisar correlacionar a mesma entidade em múltiplos bancos/contextos.
127+
- Prefira `ISoftDeletable` e `IActiveState` para cenários de (des)ativação e exclusão lógica.
128+
129+
Para integração com persistência, consulte `.docs/workcontext.md`.
130+

RoyalCode.EnterprisePatterns/.docs/instructions-for-copilot.md

Whitespace-only changes.

0 commit comments

Comments
 (0)