Fluent API Code generation (original) (raw)
Configuration class
Create a configuration class implement ICodeGenerationRegister.
public class MyRegister : ICodeGenerationRegister { public void Register(CodeGenerationConfig config) { config.AdaptTo("[name]Dto") .ForAllTypesInNamespace(Assembly.GetExecutingAssembly(), "Sample.CodeGen.Domains");
config.GenerateMapper("[name]Mapper")
.ForType<Course>()
.ForType<Student>();
}}
Generate models
Declare AdaptFrom, AdaptTo, or AdaptTwoWays.
Example:
config.AdaptTo("[name]Dto") .ForType();
Then Mapster will generate:
public class StudentDto { ... }
Add types to generate
You can add types by ForTypes, ForAllTypesInNamespace, ForType<>, and you can remove added types using ExcludeTypes.
config.AdaptTo("[name]Dto") .ForAllTypesInNamespace(Assembly.GetExecutingAssembly(), "Sample.CodeGen.Domains") .ExcludeTypes(typeof(SchoolContext)) .ExcludeTypes(type => type.IsEnum)
Ignore some properties on generation
By default, code generation will ignore properties that annotated [AdaptIgnore] attribute. But you can add more settings which include IgnoreAttributes, IgnoreNoAttributes, IgnoreNamespaces.
Example:
config.AdaptTo("[name]Dto") .ForType() .IgnoreNoAttributes (typeof(DataMemberAttribute));
public class Student { [DataMember] public string Name { get; set; } //this property will be generated public string LastName { get; set; } //this will not be generated }
Ignore a property
config.AdaptTo("[name]Dto") .ForType(cfg => { cfg.Ignore(poco => poco.LastName); });
Change a property name, type
config.AdaptTo("[name]Dto") .ForType(cfg => { cfg.Map(poco => poco.LastName, "Surname"); //change property name cfg.Map(poco => poco.Grade, typeof(string)); //change property type });
Forward property types
By default, code generation will forward type on the same declaration. (For example, Student has ICollection<Enrollment>, after code generation StudentDto will has ICollection<EnrollmentDto>).
You can override this by AlterType.
config.AdaptTo("[name]Dto") .ForAllTypesInNamespace(Assembly.GetExecutingAssembly(), "Sample.CodeGen.Domains") .AlterType<Student, Person>(); //forward all Student to Person
Generate readonly properties
For AdaptTo and AdaptTwoWays, you can generate readonly properties with MapToConstructor setting.
For example:
config.AdaptTo("[name]Dto") .ForType() .MapToConstructor(true);
This will generate:
public class StudentDto { public string Name { get; }
public StudentDto(string name) {
this.Name = name;
}}
Generate nullable properties
For AdaptFrom, you can generate nullable properties with IgnoreNullValues setting.
For example:
config.AdaptFrom("[name]Merge") .ForType() .IgnoreNullValues(true);
This will generate:
public class StudentMerge { public int? Age { get; set; } }
Generate extension methods
Generate using GenerateMapper.
For any POCOs declared with AdaptFrom, AdaptTo, or AdaptTwoWays, you can declare GenerateMapper in order to generate extension methods.
Example:
config.AdaptTo("[name]Dto") .ForType();
config.GenerateMapper("[name]Mapper") .ForType();
Then Mapster will generate:
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 => ... }