Skip to content

hakose/BatMap

 
 

Repository files navigation

BatMap - The Mapper we deserve, not the one we need.

🦇 BatMap Opininated (yet another) mapper, mainly to convert between EF Entities and DTOs.

Build Status Build status Coverage Status NuGet Badge Join the chat at https://gitter.im/NaNaNaNaBatMap/Lobby GitHub issues GitHub license

GitHub stars GitHub forks

Let's first obey the number one rule for mappers, a benchmark (using BenchmarkDotNet):

Method Mean
BatMap 💥 1.3309 ms 💥
Mapster 2.0377 ms
SafeMapper 2.0371 ms
HandWritten 2.1175 ms
AutoMapper 2.6187 ms
TinyMapper 2.8119 ms
ExpressMapper 5.0814 ms
FastMapper 5.9380 ms

Results may (probably) vary. Latest run can bee seen on Appveyor Build.

  • Fast (enough)
  • NOT over-engineered, code is really simple
  • Instantiatable mapper
  • Convention based, zero configuration static shortcut exists too (obviously named Mapper)
  • Does not crash when faced with circular-dependencies during registration
  • In fact, can resolve recurring instances to same target instance (yaay no StackOverflowException!)
  • Can project IQueryable<TSource> to IQueryable<TTarget> with respect to includes (via auto-detection or with custom parameters)
  • and much more...

API

Registration with static API:

Mapper.RegisterMap<Customer, CustomerDTO>();

or use an instance:

var mapper = new MapConfiguration(dynamicMapping: DynamicMapping.MapAndCache, preserveReferences: true);
mapper.RegisterMap<Customer, CustomerDTO>();

Note: You don't have to register type mappings when using a MapConfiguration with Dynamic Mapping enabled (like the static API uses).

You can customize expressions for members:

mapper.RegisterMap<Order, OrderDTO>(b => b.MapMember(o => o.Price, (o, mc) => o.Count * o.UnitPrice));

Map an object:

Mapper.Map<CustomerDTO>(customer);

Map an enumerable:

customers.MapTo<Customer, CustomerDTO>(preserveReferences: true);  // extension methods FTW!

Project a query:

customerQuery.ProjectTo<CustomerDTO>(checkIncludes: true);

or with expanding specific navigations:

customerQuery.ProjectTo<Customer, CustomerDTO>(c => c.Addresses, c => c.Orders);

Note: If you want to change mapping behavior, create a class that inherits from ExpressionProvider, override CreateMemberBinding and inject an instance of your class to MapConfiguration.

Where can I get it?

First, install NuGet. Then, install BatMap from the package manager console:

PM> Install-Package BatMap

Documentation

You might want to visit wiki for more.


Developed with ❤️ at Doğuş Teknoloji.

About

🦇 Convention-based, fast object mapper.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%