Skip to content

ganiputras/AIMapper

Repository files navigation

AIMapper Logo

AIMapper

Fleksibel, intuitif, dan performa tinggi untuk object mapping di .NET

.NET License: MIT Status: Production Ready


✨ Tentang AIMapper

AIMapper adalah library object-to-object mapping untuk .NET 8 yang mendukung konfigurasi berbasis atribut maupun fluent interface.
Dirancang sebagai alternatif ringan AutoMapper, AIMapper mendukung:

  • Flattening & unflattening properti nested
  • Mapping berbasis atribut [Map]
  • Konfigurasi fluent (cfg.ForMember(...))
  • Null substitute, converter, condition, ignore
  • Paging async dan collection projection
  • ReverseMap dan mapping profile terpusat
  • Tanpa konfigurasi runtime

πŸ“¦ Instalasi

dotnet add package AIMapper

πŸš€ Quick Start

1. Definisikan Model & DTO

public class User {
    public int Id { get; set; }
    public string? Name { get; set; }
    public UserProfile? Profile { get; set; }
}

public class UserProfile {
    public string? Address { get; set; }
}

public class UserDto {
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? Address { get; set; }
}

2. Tambahkan ke DI

services.AddAIMapper();

3. Konfigurasi Mapping

mapper.Configure<User, UserDto>(cfg => {
    cfg.ForMember("Address", o => o.CustomPath = "Profile.Address");
});

4. Mapping Object & Koleksi

var dto = mapper.Map<User, UserDto>(user);
var dtos = users.ProjectTo<User, UserDto>(mapper).ToList();

🎯 Fitur Fluent Mapping

Fitur Contoh
Ignore cfg.ForMember("Name", o => o.Ignore());
CustomPath cfg.ForMember("Address", o => o.CustomPath = "Profile.Address");
Condition cfg.ForMember("IsActive", o => o.Condition<User, UserDto>((src, dest) => src.Status == StatusEnum.Active));
NullSubstitute cfg.ForMember("Email", o => o.NullSubstitute("default@email.com"));
ValueConverter cfg.ForMember("Registered", o => o.ConvertUsing<DateTime?, string?>(dt => dt?.ToString("yyyy-MM-dd")));
BeforeMap / AfterMap cfg.BeforeMap(...); cfg.AfterMap(...);
ReverseMap cfg.ReverseMap((Mapper)mapper);
Paging Async var pageDto = await users.ProjectToPagedListAsync<User, UserDto>(mapper, 1, 10);

πŸ”₯ Contoh MappingProfile

public class UserProfileMap : MapperProfile
{
    public override void Configure(IMapper mapper)
    {
        mapper.Configure<User, UserDto>(cfg =>
        {
            cfg.ForMember("Address", o => o.CustomPath = "Profile.Address");
            cfg.ForMember("Email", o => o.NullSubstitute("default@email.com"));
            cfg.ForMember("Registered", o => o.ConvertUsing<DateTime?, string?>(dt => dt?.ToString("yyyy-MM-dd")));
            cfg.ForMember("IsActive", o => o.Condition<User, UserDto>((src, dest) => src.Status == StatusEnum.Active));
            cfg.ForMember("Name", o => o.Ignore());
            cfg.BeforeMap((src, dest) => dest.Point = src.Point ?? 0);
            cfg.AfterMap((src, dest) => dest.Name = src.Name?.ToUpper());
            cfg.ReverseMap((Mapper)mapper);
        });

        mapper.Configure<Order, OrderDto>(cfg =>
        {
            cfg.ForMember("CustomerName", o => o.CustomPath = "Customer.Name");
            cfg.ForMember("Total", o => o.NullSubstitute(0));
            cfg.AfterMap((src, dest) => dest.IsPaid = src.Status == OrderStatus.Paid);
            cfg.ReverseMap((Mapper)mapper);
        });
    }
}

Registrasi MappingProfile:

mapper.ApplyProfilesFromCurrentAssembly();

πŸ“ Contoh Lengkap

Lihat AIMapperSampleDemo.cs di project AIMapper.SampleApp untuk contoh implementasi penuh.


πŸ“š Table of Contents

πŸ”Œ Instalasi & Registrasi

dotnet add package AIMapper
services.AddAIMapper(typeof(MyMapperProfile).Assembly);

πŸ”§ Basic Mapping

var dto = mapper.Map<PersonDto>(person);

πŸŽ›οΈ Custom Mapping (ForMember)

cfg.CreateMap<Person, PersonDto>()
   .ForMember(dest => dest.AddressCity, opt => opt.MapFrom(src => src.Address.City));

πŸ“¦ Flattening Otomatis

public class PersonDto
{
    public string AddressCity { get; set; }
}

Jika Person.Address.City ada, maka AddressCity akan otomatis terisi.

✳️ Override Flattening

Gunakan .ForMember(...).MapFrom(...) untuk override flattening otomatis.

πŸ” Reverse Mapping

cfg.CreateMap<Person, PersonDto>().ReverseMap();

πŸ“š Collection Mapping

List<PersonDto> dtos = mapper.Map<List<PersonDto>>(people);

πŸ” LINQ Projection (ProjectTo)

var dtos = dbContext.People.ProjectTo<PersonDto>(mapper);

🧰 Extension Method .MapTo<T>()

var dto = person.MapTo<PersonDto>();

βš™οΈ Global Configuration

services.AddAIMapper(cfg =>
{
    cfg.NullSubstitution = "-";
    cfg.IgnoreUnmapped = true;
});

πŸ› οΈ Manual Mapper (tanpa DI)

var config = new MapperConfigurationExpression();
config.CreateMap<Person, PersonDto>();
var mapper = new Mapper(config);

🚫 Ignore Property

.ForMember(dest => dest.IgnoredField, opt => opt.Ignore());

βœ… Validasi Mapping

mapper.Configuration.AssertConfigurationIsValid();

🧠 Source Generator + MapAttribute

public class PersonDto
{
    [Map(Source = "Name")]
    [Map(NullSubstitute = "Unknown")]
    [Map(Condition = "x => !string.IsNullOrWhiteSpace(x)")]
    [Map(Converter = "x => x.ToUpperInvariant()")]
    public string DisplayName { get; set; }
}

πŸ“„ Lisensi

Proyek ini menggunakan lisensi MIT License.

About

AIMapper sudah memiliki fitur mapping

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages