Skip to content

Commit 68a60ee

Browse files
committed
Add documentation for MapFrom attribute support
Documentation updates for MapFrom attribute -- Added detailed explanation and usage examples for the new [MapFrom] attribute, enabling explicit DTO property mapping from source properties. -- Updated limitations section to reflect support for explicit renaming/aliasing via MapFrom. -- Included MapFrom attribute signature, best practices, and EF Core interaction details. -- Adjusted FAQ and documentation structure to accommodate new content.
1 parent c709ebd commit 68a60ee

2 files changed

Lines changed: 61 additions & 5 deletions

File tree

src/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Gerador/Source Generator para criar automaticamente projeções (`Expression<Fun
77
- `[AutoProperties]` ou `[AutoProperties<TFrom>]`: gera propriedades simples automaticamente (primitivos, string, bool, DateTime, enum, struct, coleções simples `IEnumerable<T>` desses tipos).
88
- Flattening por convenção: nomes concatenados em PascalCase resolvem cadeias aninhadas (ex.: `CustomerAddressCountryRegionName` ? `a.Customer.Address.Country.Region.Name`).
99
- Exclusão de propriedades: `Exclude = [ nameof(Entity.Prop) ]`.
10+
- `[MapFrom("SourceProp")]`: mapeia explicitamente uma propriedade do DTO a partir de um nome de propriedade de origem (suporta `string` literal e `nameof(...)`).
1011
- Diagnósticos de compilação para uso incorreto, tipos incompatíveis e conflitos.
1112

1213
## Quickstart
@@ -185,7 +186,6 @@ public partial class OrderFlat
185186
- Uso incorreto de atributos (`RCSS003``RCSS005`).
186187

187188
## Limitações Resumidas
188-
- Sem renome/alias explícito ainda (`MapFrom`).
189189
- Sem transformações de tipo (formatters / custom converters).
190190
- Desambiguação de flattening limitada em colisões de prefixo.
191191

src/docs.md

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ Gerador de código (Roslyn Source Generator) para criação de projeções (DTOs
1212
6. Propriedades Suportadas e Filtragem
1313
7. Exclusão de Propriedades
1414
8. Flattening (Projeção de Caminhos Aninhados)
15-
9. FAQ Rápido
15+
9. MapFrom (Alias explícito de origem)
16+
10. FAQ Rápido
1617

1718
---
1819
## 1. Visão Geral
@@ -193,10 +194,50 @@ A convenção concatena os identificadores do caminho em PascalCase.
193194
| `AutoSelect<TFrom>` | Ativa geração de expressão + extensões. |
194195
| `AutoProperties` / `AutoProperties<TFrom>` | Geração automática de propriedades simples. |
195196
| Flattening | Casamento por convenção de nomes concatenados para acessar membros aninhados. |
197+
| `MapFrom` | Mapeia explicitamente a origem de uma propriedade do DTO usando nome de membro da origem. |
196198

197199
---
198200
## 4. Atributos Disponíveis
199-
Mesmos comportamentos já descritos anteriormente (`AutoSelect<TFrom>`, `AutoProperties`, `AutoProperties<TFrom>`, `Exclude`).
201+
Mesmos comportamentos já descritos anteriormente (`AutoSelect<TFrom>`, `AutoProperties`, `AutoProperties<TFrom>`, `Exclude`, `MapFrom`).
202+
203+
### 4.1 `MapFromAttribute`
204+
Permite definir diretamente de qual propriedade de `TFrom` uma propriedade do DTO será mapeada, sem depender de convenções de nome (flattening) ou posição.
205+
206+
Assinatura:
207+
```csharp
208+
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
209+
public sealed class MapFromAttribute : Attribute
210+
{
211+
public MapFromAttribute(string propertyName) { PropertyName = propertyName; }
212+
public string PropertyName { get; set; }
213+
}
214+
```
215+
216+
Uso:
217+
```csharp
218+
[AutoSelect<Product>]
219+
public partial class CustomProductDetails
220+
{
221+
[MapFrom("Id")] // literal
222+
public Guid CustomId { get; set; }
223+
224+
[MapFrom(nameof(Product.Name))] // nameof evita typos
225+
public string CustomName { get; set; }
226+
227+
[MapFrom(nameof(Product.Active))]
228+
public bool CustomActive { get; set; }
229+
}
230+
```
231+
232+
Expressão gerada (trecho real):
233+
```csharp
234+
new CustomProductDetails
235+
{
236+
CustomId = a.Id,
237+
CustomName = a.Name,
238+
CustomActive = a.Active
239+
}
240+
```
200241

201242
---
202243
## 5. Membros Gerados
@@ -238,10 +279,25 @@ Exemplos:
238279

239280
Limitações atuais do flattening:
240281
- Não há desambiguação quando múltiplos caminhos possíveis partilham prefixo idêntico; o comportamento depende da ordem de descoberta.
241-
- Não há hoje suporte a mapeamento customizado (ex: abreviações, alias).
282+
- Para alias explícito de origem, utilize `MapFrom`.
283+
284+
---
285+
## 9. MapFrom (Alias explícito de origem)
286+
`MapFrom` é a forma suportada de declarar alias/renome de mapeamento diretamente no DTO.
287+
288+
Quando usar:
289+
- Preferir quando o nome do DTO não segue a convenção de flattening ou quando há colisões/ambiguidade.
290+
- Útil para garantir clareza e evitar dependência da heurística de caminhos.
291+
292+
Boas práticas:
293+
- Use `nameof(T.Prop)` sempre que possível para segurança em refactors.
294+
- Evite caminhos inexistentes; o gerador emitirá diagnósticos em caso de propriedade inválida.
295+
296+
Interação com EF Core:
297+
- O mapeamento gerado por `MapFrom` continua parte da `Expression` e é traduzível pelo provedor.
242298

243299
---
244-
## 9. FAQ Rápido
300+
## 10. FAQ Rápido
245301
**Flattening precisa de atributo?** Não, é por convenção do nome.
246302
**Qual profundidade máxima?** Não fixada; limitada apenas pela cadeia navegável e heurística de casamento.
247303
**Posso misturar flattening e objetos aninhados?** Sim.

0 commit comments

Comments
 (0)