From ABP Sensei
Guides object mapping in ABP Framework v10.4 using IObjectMapper, Mapperly (default), or AutoMapper. Handles entity↔DTO conversion with profiles, attributes, and custom field mapping.
How this skill is triggered — by the user, by Claude, or both
Slash command
/abp-sensei:abp-object-mappingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
ABP Framework v10.4 object mapping guide. Entity↔DTO conversion via the `IObjectMapper` abstraction. In v10.4, **Mapperly** (compile-time, source-generated) is the default provider; **AutoMapper** is also supported. Stick with whichever one the solution already uses.
ABP Framework v10.4 object mapping guide. Entity↔DTO conversion via the IObjectMapper abstraction. In v10.4, Mapperly (compile-time, source-generated) is the default provider; AutoMapper is also supported. Stick with whichever one the solution already uses.
ABP base classes (ApplicationService, etc.) come with an ObjectMapper property out of the box:
public class BookAppService : ApplicationService
{
public async Task<BookDto> GetAsync(Guid id)
{
var book = await _bookRepository.GetAsync(id);
return ObjectMapper.Map<Book, BookDto>(book); // single object
}
public async Task<List<BookDto>> GetAllAsync()
{
var books = await _bookRepository.GetListAsync();
return ObjectMapper.Map<List<Book>, List<BookDto>>(books); // list
}
// Map onto an existing object (source, destination)
public void Update(Book book, UpdateBookDto input)
=> ObjectMapper.Map(input, book);
}
In places without a base class, inject IObjectMapper.
A compile-time source generator — no reflection, fast. ABP integration uses MapperBase<TSource, TDestination>:
[Mapper]
public partial class BookToBookDtoMapper : MapperBase<Book, BookDto>
{
public override partial BookDto Map(Book source);
public override partial void Map(Book source, BookDto destination);
}
[Mapper]
public partial class CreateUpdateBookDtoToBookMapper : MapperBase<CreateUpdateBookDto, Book>
{
public override partial Book Map(CreateUpdateBookDto source);
public override partial void Map(CreateUpdateBookDto source, Book destination);
}
Module configuration:
[DependsOn(typeof(AbpMapperlyModule))]
public class MyApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddMapperlyObjectMapper<MyApplicationModule>();
}
}
Since the mappers derive from MapperBase, an ObjectMapper.Map<Book, BookDto>(...) call uses them automatically.
[Mapper]
public partial class BookMapper : MapperBase<Book, BookDto>
{
[MapProperty(nameof(Book.Name), nameof(BookDto.Title))] // different name
public override partial BookDto Map(Book source);
public override partial void Map(Book source, BookDto destination);
}
If the solution uses AutoMapper, define a profile:
public class MyApplicationAutoMapperProfile : Profile
{
public MyApplicationAutoMapperProfile()
{
CreateMap<Book, BookDto>();
CreateMap<CreateUpdateBookDto, Book>();
}
}
Module configuration:
[DependsOn(typeof(AbpAutoMapperModule))]
public class MyApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<MyApplicationModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<MyApplicationModule>(validate: true);
});
}
}
On the DTO:
[AutoMapFrom(typeof(Book))] // Book → BookDto
public class BookDto : EntityDto<Guid>
{
public string Name { get; set; }
}
[AutoMapTo(typeof(Book))] // CreateBookDto → Book
public class CreateBookDto { public string Name { get; set; } }
ObjectMapper abstraction — don't depend directly on the provider (Mapperly/AutoMapper)validate: true with AutoMapper — catch unmapped fields earlynpx claudepluginhub burakdmir/abp-skills --plugin abp-senseiProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.