# AutoMapper Mapping Pattern - Ladaer.BackEnd

## Quy tắc chính
- **PHẢI** dùng AutoMapper Profile để khai báo mapping (Entity → Item/Model và ngược lại)
- **KHÔNG** viết manual mapping trong Extension files riêng lẻ (`DTO/Extensions/`)
- Profile class + Extension methods class **nằm cùng 1 file** trong `Infrastructures/DTO/Profiles/`

## Cấu trúc file
```
Infrastructures/DTO/Profiles/{Module}MappingProfile.cs
├── {Module}MappingProfile : Profile  →  Khai báo CreateMap<> trong constructor
└── {Module}MappingExtensions (static)  →  Extension methods dùng MapTo<>
```

## Các mẫu phổ biến

### Extension method chuẩn:
```csharp
public static EntityItem ToItem(this Entity entity)
    => entity.MapTo<Entity, EntityItem>();
```

### ForMember cho navigation property:
```csharp
.ForMember(dest => dest.CustomerName, 
    opt => opt.MapFrom(src => src.Customer != null ? src.Customer.FullName : ""))
```

### ForMember cho nullable → non-nullable:
```csharp
.ForMember(dest => dest.CreatedTime, 
    opt => opt.MapFrom(src => src.CreatedTime ?? DateTimeOffset.MinValue))
```

### ForMember cho collection count:
```csharp
.ForMember(dest => dest.LevelCount, 
    opt => opt.MapFrom(src => src.Levels != null ? src.Levels.Count : 0))
```

## Using trong Service
```csharp
using Ladaer.BackEnd.Infrastructures.DTO.Profiles; // ĐÚNG
// KHÔNG dùng: using Ladaer.BackEnd.Infrastructures.DTO.Extensions;
```

## MapTo<> helper
Nằm trong `Infrastructures/DTO/MappingExtensions.cs` - đây là helper chung, KHÔNG cần sửa đổi.

## Anti-patterns
- ❌ Tạo file `DTO/Extensions/XxxExtensions.cs` với `new XxxItem { ... }`
- ❌ Dùng `using DTO.Extensions` trong Services
- ❌ Viết mapping logic ngoài Profile
