base on A fast, fun and stimulating object to object Mapper ![Mapster Icon](https://cloud.githubusercontent.com/assets/5763993/26522718/d16f3e42-4330-11e7-9b78-f8c7402624e7.png) ## Mapster - The Mapper of Your Domain Writing mapping methods is a machine job. Do not waste your time, let Mapster do it. [![NuGet](https://img.shields.io/nuget/v/Mapster.svg)](https://www.nuget.org/packages/Mapster) ### Installation Install Mapster with the NuGet CLI: ``` Install-Package Mapster ``` Or use the .NET core CLI to install Mapster: ``` dotnet add package Mapster ``` ### Basic usage #### Mapping to a new object Mapster creates the destination object and maps values to it. ```csharp var destObject = sourceObject.Adapt<Destination>(); ``` #### Mapping to an existing object You create the object, Mapster maps to the object. ```csharp sourceObject.Adapt(destObject); ``` #### You can get IMapper instance via dependency injection so you do not have to change code when migrating to mapster from automapper Add Mapster to service collection ```csharp services.AddMapster(); ``` And use it with DI ```csharp public class Test { public Test(IMapper mapper) { var sourceObject = mapper.Adapt<Destination>(); } } ``` #### Queryable Extensions Mapster also provides extensions to map queryables. ```csharp 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(); } ``` #### Generating models & mappers No need to write your own DTO classes. Mapster provides [Mapster.Tool](https://github.com/MapsterMapper/Mapster/wiki/Mapster.Tool) to help you generating models. And if you would like to have explicit mapping, Mapster also generates mapper class for you. ```csharp [AdaptTo("[name]Dto"), GenerateMapper] public class Student { ... } ``` Then Mapster will generate: ```csharp 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 => ... } ``` ### What's new - [Fluent API for code generation](https://github.com/MapsterMapper/Mapster/wiki/Fluent-API-Code-generation) - [Automatically generate mapping code on build](https://github.com/MapsterMapper/Mapster/wiki/Mapster.Tool) - [Define setting to nested mapping](https://github.com/MapsterMapper/Mapster/wiki/Config-for-nested-mapping) - [`ISet`, `IDictionary`, `IReadOnlyDictionary` support](https://github.com/MapsterMapper/Mapster/wiki/Data-types#collections) - [`EmptyCollectionIfNull`, `CreateNewIfNull` DestinationTransform](https://github.com/MapsterMapper/Mapster/wiki/Setting-values#transform-value) - [Several fixes](https://github.com/MapsterMapper/Mapster/releases/) - New plugins - [Immutable collection support](https://github.com/MapsterMapper/Mapster/wiki/Immutable) ### Why Mapster? #### Performance & Memory efficient Mapster was designed to be efficient on both speed and memory. You could gain a 4x performance improvement whilst using only 1/3 of memory. And you could gain up to 12x faster performance with - [Roslyn Compiler](https://github.com/MapsterMapper/Mapster/wiki/Debugging) - [FEC](https://github.com/MapsterMapper/Mapster/wiki/FastExpressionCompiler) - Code generation | Method | Mean | StdDev | Error | Gen 0 | Gen 1 | Gen 2 | Allocated | |-------------------------- |----------:|----------:|----------:|-----------:|------:|------:|----------:| | 'Mapster 6.0.0' | 108.59 ms | 1.198 ms | 1.811 ms | 31000.0000 | - | - | 124.36 MB | | 'Mapster 6.0.0 (Roslyn)' | 38.45 ms | 0.494 ms | 0.830 ms | 31142.8571 | - | - | 124.36 MB | | 'Mapster 6.0.0 (FEC)' | 37.03 ms | 0.281 ms | 0.472 ms | 29642.8571 | - | - | 118.26 MB | | 'Mapster 6.0.0 (Codegen)' | 34.16 ms | 0.209 ms | 0.316 ms | 31133.3333 | - | - | 124.36 MB | | 'ExpressMapper 1.9.1' | 205.78 ms | 5.357 ms | 8.098 ms | 59000.0000 | - | - | 236.51 MB | | 'AutoMapper 10.0.0' | 420.97 ms | 23.266 ms | 35.174 ms | 87000.0000 | - | - | 350.95 MB | #### Step into debugging [Step-into debugging](https://github.com/MapsterMapper/Mapster/wiki/Debugging) lets you debug your mapping and inspect values just like your code. ![image](https://cloud.githubusercontent.com/assets/5763993/26521773/180427b6-431b-11e7-9188-10c01fa5ba5c.png) #### Code Generation 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](https://github.com/MapsterMapper/Mapster/wiki/Mapster.Tool) NEW! * [TextTemplate](https://github.com/MapsterMapper/Mapster/wiki/TextTemplate) ### Change logs https://github.com/MapsterMapper/Mapster/releases ### Usages * [English](https://github.com/MapsterMapper/Mapster/wiki) * [中文文档](https://github.com/rivenfx/Mapster-docs) (sp thx to [@staneee](https://github.com/staneee)) ### Acknowledgements [JetBrains](https://www.jetbrains.com/?from=Mapster) 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 ![image](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/JetBrains_Logo_2016.svg/121px-JetBrains_Logo_2016.svg.png) ", Assign "at most 3 tags" to the expected json: {"id":"1927","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"