Skip to content

Mapster

中文文档:https://github.com/rivenfx/Mapster-docs

Github:https://github.com/MapsterMapper/Mapster

参考博客:https://code-maze.com/mapster-aspnetcore-introduction/

概念:Mapster 是一个将一种对象类型映射到另一种对象类型的库。

安装与配置

Mapster 可以通过NuGet进行安装,命令如下:

Shell
Install-Package Mapster

基本使用

创建实体对象

以下的示例将从一个实体对象 Person 转换为另一个实体对象 PersonDto

C#
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
}

public class PersonDto
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string NewPassword { get; set; }
    public string NewAddress { get; set; }
}

Controller

新建一个 PersonController.cs 控制器,用于测试转换:

C#
[HttpGet]
public IActionResult GetPersonDto()
{
    var person = new Person { Id = 1, Name = "张三", Password = "123456" };

    // 方式一:映射到现有对象
    var personDto = new PersonDto();
    var res1 = person.Adapt(personDto);

    // 方式二:泛型映射(常用)
    var res2 = person.Adapt<PersonDto>();

    return Ok(new { res1, res2 });
}

在这个示例中,Mapster 会自动将源对象的属性值赋值给目标对象的相应属性,其中,源对象中没有 Address 字段,所以目标对象中 Address 字段的值为 null 。

自定义映射

有时候我们需要更复杂的映射,例如在源对象和目标对象之间存在一些不同的属性名称,或者需要进行一些转换才能进行映射。

Mapster 允许我们通过创建一个映射配置来实现自定义映射。

以下是一个示例,展示如何使用Mapster进行自定义映射:

  1. 新建 MapperConfig.cs 文件,创建一个方法 RegisterMapsterConfiguration:
C#
public static void RegisterMapsterConfiguration(this IServiceCollection services)
{
    // 自定义映射规则
    TypeAdapterConfig<Person, PersonDto>
        .NewConfig()
        .Map(dest => dest.Id, src => src.Id)
        .Map(dest => dest.UserName, src => src.Name)
        .Map(dest => dest.NewPassword, src => src.Password);
  
    // 启用全局设置,并扫描当前执行程序集中的所有映射配置
    TypeAdapterConfig.GlobalSettings.Scan(Assembly.GetExecutingAssembly());
}
  1. Progrem.cs 中,注入 自定义的映射规则:
C#
builder.Services.RegisterMapsterConfiguration();
  1. PersonController.cs 中,写一个接口进行测试:
C#
[HttpGet]
public IActionResult GetPersonDto2()
{
    var person = new Person { Id = 1, Name = "张三", Password = "123456" };
    
    // 映射转换
    var personDto = person.Adapt<PersonDto>();
  
    return Ok(personDto);
}

IQueryable 类型映射

当源数据是 IQueryable 集合类型时,就不能使用 Adapt<T> 的形式映射了(会映射为 null),此时需要使用新的方法:ProjectToType<T>();

C#
[HttpGet]
public IActionResult GetQueryableUserDto()
{
    List<User> user = new List<User>
    {
        new User
        {
            Id = 1,
            Name = "张三",
            Password = "123456",
            Address = "山东省济南市",
            Department = "软件研发部"
        },
        new User
        {
            Id = 2,
            Name = "李四",
            Password = "654321",
            Address = "甘肃省武威市",
            Department = "人民教师"
        }
    };

    //假设源数据是 IQueryable 类型
    IQueryable<User> queryUser = user.AsQueryable();
    //此时可以使用 ProjectToType<T> 类型进行映射
    IQueryable<UserDTO> userDto = queryUser.ProjectToType<UserDTO>();

    return Ok(userDto);
}

Released under the MIT License.

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。