Writing mapping methods is a machine job. Do not waste your time, let Mapster do it.
| Package | Stable | Pre-release |
|---|---|---|
| Mapster | ||
| Mapster.Core | ||
| Mapster.DependencyInjection | ||
| Mapster.EFCore | ||
| Mapster.EF6 | ||
| Mapster.JsonNet | ||
| Mapster.Immutable | ||
| Mapster.Diagnostics | ||
| ExpressionDebugger |
| Tool | Stable | Pre-release |
|---|---|---|
| Mapster.Tool |
Install Mapster with the NuGet CLI:
Install-Package MapsterOr use the .NET core CLI to install Mapster:
dotnet add package Mapster --project <PROJECT_NAME>Mapster creates the destination object and maps values to it.
var destObject = sourceObject.Adapt<Destination>();You create the object, Mapster maps to the object.
sourceObject.Adapt(destObject);You can get your IMapper instance via dependency injection, so you do not have to change code, when migrating to mapster from automapper!
Just add Mapster to service collection:
services.AddMapster();And use it with DI in your Project:
public class Test
{
public Test(IMapper mapper)
{
var sourceObject = mapper.Adapt<Destination>();
}
}Mapster also provides extensions to map queryables.
using (MyDbContext context = new MyDbContext())
{
// Build a Select Expression from DTO
var destinations = context.Sources.ProjectToType<Destination>().ToList();
// Versus creating by hand:
var destinations = context.Sources.Select(c => new Destination {
Id = c.Id,
Name = c.Name,
Surname = c.Surname,
....
})
.ToList();
}No need to write your own DTO classes. Mapster provides Mapster.Tool to help you generating models. And if you would like to have explicit mapping, Mapster also generates mapper class for you.
[AdaptTo("[name]Dto"), GenerateMapper]
public class Student {
...
}Then Mapster will generate for you:
public class StudentDto {
...
}
public static class StudentMapper {
public static StudentDto AdaptToDto(this Student poco) { ... }
public static StudentDto AdaptTo(this Student poco, StudentDto dto) { ... }
public static Expression<Func<Student, StudentDto>> ProjectToDto => ...
}- Fluent API for code generation
- Automatically generate mapping code on build
- Define setting to nested mapping
ISet,IDictionary,IReadOnlyDictionarysupportEmptyCollectionIfNull,CreateNewIfNullDestinationTransform- Several fixes
- New plugins
Mapster was designed to be efficient on both speed and memory. The repository includes a benchmark project in src/Benchmark that compares the local Mapster build, its compiler variants, and other modern mapping libraries like AutoMapper, Mapperly, and Facet.
- Roslyn Compiler
- FEC
- Code generation
- Facet
- Mapperly
The snapshot below shows the FlatTypes scenario (Person -> PersonDTO), a best-case DTO with simple property-to-property mapping and no nested objects or collections.
Note
More complex object shapes can change the relative results. See the complete benchmark results for ComplexTypes, RecursiveTypes, and TotalAllTypes.
| Method | MapOperations | Mean | StdDev | Error | Ns/Map | Ratio | Gen0 | Allocated | Alloc Ratio | Bytes/Map |
|---|---|---|---|---|---|---|---|---|---|---|
Mapster 10.0.8 |
1000000 | 6.849 ms | 0.6851 ms | 1.0358 ms | 6.849 | 1.01 | 4781 | 76.29 MB | 1.00 | 80 |
Mapster 10.0.8 (Roslyn) |
1000000 | 6.579 ms | 0.2782 ms | 0.4206 ms | 6.579 | 0.97 | 4781 | 76.29 MB | 1.00 | 80 |
Mapster 10.0.8 (FEC) |
1000000 | 6.549 ms | 0.9130 ms | 1.3803 ms | 6.549 | 0.97 | 4781 | 76.29 MB | 1.00 | 80 |
Mapster 10.0.8 (Codegen) |
1000000 | 5.868 ms | 0.3266 ms | 0.5488 ms | 5.868 | 0.86 | 4781 | 76.29 MB | 1.00 | 80 |
AutoMapper 14.0.0 |
1000000 | 29.645 ms | 0.8963 ms | 1.5062 ms | 29.645 | 4.37 | 4750 | 76.29 MB | 1.00 | 80 |
Facet 6.5.5 |
1000000 | 7.801 ms | 1.0231 ms | 1.5467 ms | 7.801 | 1.15 | 8601 | 137.33 MB | 1.80 | 144 |
Facet 6.5.5 (Compiled Projection) |
1000000 | 5.508 ms | 0.7064 ms | 1.0679 ms | 5.508 | 0.81 | 4781 | 76.29 MB | 1.00 | 80 |
Mapperly 4.3.1 |
1000000 | 6.521 ms | 0.8369 ms | 1.2652 ms | 6.521 | 0.96 | 4781 | 76.29 MB | 1.00 | 80 |
Step-into debugging lets you debug your mapping and inspect values just like your code.
Code generation allows you to
- Validate mapping at compile time
- Getting raw performance
- Seeing your mapping code & debugging
- Finding usage of your models' properties
There are currently two tools which you can choose based on your preferences.
- Mapster.Tool NEW!
- TextTemplate
https://github.com/MapsterMapper/Mapster/releases
JetBrains kindly provides Mapster with a free open-source licence for their Resharper and Rider.
- Resharper makes Visual Studio a much better IDE
- Rider is fast & powerful cross platform .NET IDE
