From architecture-dotnet
Gera entidades de domínio seguindo DDD e Clean Architecture. Use quando o usuário mencionar "criar entidade", "nova entidade", "entity", "aggregate", "aggregate root", "value object", "domain model", "modelo de domínio", "classe de domínio", "tabela", "criar tabela", "nova tabela", "definir entidade", "modelar entidade". Também dispara quando pedir para criar modelos que representam conceitos de negócio, objetos persistidos ou agregados. NÃO use para DTOs (use application-feature), endpoints (use endpoint-generator) ou configurações de banco (use infrastructure).
How this skill is triggered — by the user, by Claude, or both
Slash command
/architecture-dotnet:architecture-entitiesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Gera entidades de domínio, Value Objects, Aggregates e interfaces de repositório seguindo DDD e Clean Architecture.
Gera entidades de domínio, Value Objects, Aggregates e interfaces de repositório seguindo DDD e Clean Architecture.
references/entity-template.md para estrutura de entidadesreferences/value-objects.md para Value Objectsreferences/repository-interface.md para interfaces de repositório| Tipo | Quando Usar | Características |
|---|---|---|
| Entity | Tem identidade única | Id, ciclo de vida próprio |
| Aggregate Root | Entidade raiz de um agregado | Controla consistência do agregado |
| Value Object | Definido por atributos, não identidade | Imutável, comparado por valor |
| Enum de Domínio | Estados, tipos, categorias | Strongly-typed, com comportamento |
Para Entity/Aggregate:
Para Value Object:
Domain/
├── Entities/
│ └── {Entity}.cs
├── Aggregates/
│ └── {AggregateRoot}.cs
├── ValueObjects/
│ └── {ValueObject}.cs
├── Enums/
│ └── {Enum}.cs
├── Events/
│ └── {Entity}{Action}Event.cs
├── Exceptions/
│ └── {Entity}Exception.cs
└── Interfaces/
└── I{Entity}Repository.cs
Create() para instanciaçãoprivate ou initrecord ou classe imutável// ✅ CORRETO - Entidade rica
public class Order : Entity<Guid>
{
public OrderStatus Status { get; private set; }
public void Approve(Guid approvedBy)
{
if (Status != OrderStatus.Pending)
throw new InvalidOrderStateException("Apenas pedidos pendentes podem ser aprovados");
Status = OrderStatus.Approved;
AddDomainEvent(new OrderApprovedEvent(Id, approvedBy));
}
}
// ❌ INCORRETO - Entidade anêmica
public class Order : Entity<Guid>
{
public OrderStatus Status { get; set; } // Setter público!
}
// ✅ CORRETO - Factory method com validação
public static Product Create(string name, Money price)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Nome é obrigatório", nameof(name));
return new Product(name, price);
}
// ❌ INCORRETO - Construtor público
public Product(string name, Money price) // Construtor público!
{
Name = name;
Price = price;
}
| Artefato | Padrão | Exemplo |
|---|---|---|
| Entity | {Nome} | Product, Order |
| Aggregate Root | {Nome} | Order (com OrderItem interno) |
| Value Object | {Nome} | Money, Address, Email |
| Domain Event | {Entity}{Action}Event | OrderCreatedEvent |
| Repository Interface | I{Entity}Repository | IProductRepository |
| Domain Exception | {Context}Exception | InvalidOrderStateException |
Novo conceito de domínio
│
▼
Tem identidade?
┌────┴────┐
Sim Não
│ │
▼ ▼
ENTITY VALUE OBJECT
│
▼
Controla outros
objetos?
│
Sim
│
▼
AGGREGATE ROOT
public class Order : AggregateRoot<Guid>
{
private readonly List<OrderItem> _items = new();
public IReadOnlyCollection<OrderItem> Items => _items.AsReadOnly();
public void AddItem(Product product, int quantity)
{
var item = new OrderItem(product.Id, product.Price, quantity);
_items.Add(item);
}
}
// Não usar coleção direta - criar entidade de relacionamento
public class ProductCategory : Entity<Guid>
{
public Guid ProductId { get; private set; }
public Guid CategoryId { get; private set; }
}
Causa: Entidades referenciando umas às outras diretamente Solução: Usar apenas IDs para referências entre agregados diferentes
Causa: Propriedade sem setter acessível
Solução: Usar private set (não readonly) para EF Core
Causa: Falta configuração OwnsOne no EF Core
Solução: Configurar em Infrastructure/Persistence/Configurations
npx claudepluginhub brunocesharp/claude --plugin architecture-dotnetProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.