📚
Hoa Framework
  • 一、框架指南
  • 二、功能特性
  • 三、源码结构
  • 四、代码规范
  • 五、入门指南
  • 六、依赖注入/控制反转
  • 七、控制器和服务
  • 八、对象映射指南
  • 九、数据库操作指南
    • 9.1、正向工程(Code First)
    • 9.2、逆向工程(Database First)
    • 9.3、关于仓储(IRepository)
    • 9.4、增删改操作
    • 9.5、查询操作
    • 9.6、DataSet、DataTable 操作
    • 9.7、查询结果集映射
    • 9.8、批量增删改操作
    • 9.9、存储过程、视图、函数操作
    • 9.10、工作单元和事务
    • 9.11、多上下文、读写分离
    • 9.12、切面上下文(TangentDbContext)
    • 9.13、其他操作
    • 9.14、EF Core 高性能
    • 9.15、常见错误
  • 十、开放接口指南
    • 10.1、RESTFul 和 Swagger
    • 10.2、规范化返回值
  • 十一、数据校验
  • 十二、安全授权
  • 十三、异常处理
  • 十四、日志管理
  • 十五、配置管理
  • 十六、缓存管理
  • 十七、内置工具类
    • 17.1、数据加解密
  • 十八、跨域处理
  • 十九、筛选拦截器(未)
  • 二十、进程服务(Daemon)
  • 二十一、编写测试
    • 20.1、单元测试
    • 20.2、基准测试
    • 20.3、性能测试
  • 二十二、托管部署
    • 22.1、IIS 托管部署
    • 22.2、Nginx 托管部署
    • 22.3、Docker 容器部署
  • 二十三、性能分析(MiniProfiler)
  • 二十四、其他功能
    • 23.1、第三方包管理
    • 23.2、文件上传下载
    • 23.3、Razor 视图引擎
    • 23.4、生成客户端请求代码
    • 23.5、快捷操作
  • 二十五、Docker 容器化
    • 25.1、Docker 介绍
    • 25.2、Docker 安装
    • 25.3、Docker 安装服务
    • 25.4、Docker 常用命令
    • 25.6、Docker run 常用命令
    • 25.7、Docker-Compose 介绍
    • 25.8、docker-compose.yml
    • 25.9、Docker-Compose 常用命令
    • 25.10、Docker-Compose 转换 docker run
    • 25.11、Docker 构建自己的镜像
    • 25.12、Dockerfile指南
    • 25.13、Dockerfile 常用命令
    • 25.14、Dockerfile 打包、上传、分享
    • 25.15、Docker 数据卷
    • 25.16、Docker 域网络
    • 25.17、Docker + Nginx 实现分布式集群、负载均衡
  • 二十六、DevOps 持续部署集成
    • 26.1、DevOps 介绍
    • 26.2、持续集成、交付、部署
    • 26.3、Jenkins 介绍
    • 26.4、Jenkins 安装
    • 26.5、Jenkins 初始化
    • 26.6、Jenkins 实战演练
    • 26.7、Jenkis 项目配置
    • 26.8、Jenkins 插件
  • 二十七、OpenXml/Excel 操作
  • 二十八、SaaS 多租户
  • 二十九、Git 代码管理
    • 29.1、Git 介绍
    • 29.2、Git 安装
    • 29.3、Git 基础配置
    • 29.4、Git 工作流程
    • 29.5、Git 重要概念
    • 29.6、Git 创建仓库
    • 29.7、Git 基本操作
    • 29.8、Git 分支管理
    • 29.9、Git 查看提交历史
    • 29.10、Git 标签
    • 29.11、Git 拉取/获取/推送
    • 28.12、Git GUI工具
    • 29.13、Git 私有化部署
    • 29.14、Git 推荐开发模式
    • 29.15、Svn 转 Git
  • 贡献代码
  • 更新日志
由 GitBook 提供支持
在本页
  • 传统模式(不推荐)
  • 对象映射组件(推荐)
  • Mapster 使用
  • 简单使用
  • 自定义映射规则
  • 特殊映射
  • 数据库实体映射说明
  • 将 Dto 映射到已存在的 Entity

这有帮助吗?

八、对象映射指南

将一个对象的值批量映射到另一个对象中,支持自定义映射规则。

传统模式(不推荐)

假设有两个类型:Student 和 StudentDto,现在需要将 Student 对象赋值给 StudentDto

Student

public class Student
{
    public string FirstName {get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public string Gender {get; set; }
}

StudentDto

public class StudentDto
{
    public string FullName {get; set; }
    public int Age { get; set; }
    public string Gender {get; set; }
}

传统赋值模式代码如下:

var student = new Student() 
{
    FirstName = "Monk",
    LastName = "Soul",
    Age = 27,
    Address = "广东省珠海市香洲区吉大路",
    Gender = "男"
};

// 赋值

var studentDto = new StudentDto()
{
    FullName = student.FirstName + student.LastName,
    Age = student.Age,
    Gender = student.Gender
}

通过上面的代码,可能一部分读者觉的这是一件很正常的代码,没有什么不妥。

确实,这样的代码咋看没什么不妥,但是有几个漏洞:

  1. 如果字段繁多,这赋值操作相当耗时间且容易出错

  2. 如果多次需要将 Student映射到 StudentDto中,则这样的代码散落在很大地方,给维护带来了极大的困扰

  3. 这样的赋值操作实际上污染了业务逻辑代码,不利于后续的统一管理

  4. 这样的赋值操作实在是多,无意增加了项目包的大小,开发效率也会低下

所以,我们迫切需要一种更加灵活、简易的对象赋值(映射)方式。

对象映射组件(推荐)

Mapster 使用

简单使用

将源对象映射到目标对象,并创建新的目标对象

var destObject = sourceObject.Adapt<Destination>();

将源对隐射到已存在的目标对象

var destObject = new DestObject(){...};
sourceObject.Adapt(destObject );

自定义映射规则

通常,我们的属性并非总是一一对应映射,我们可能会进行一些操作或重写,比如:StudentDto.FullName 由 Student.FirstName + Student.LastName 组成。

自定义映射支持多种方式,在 Hoa Framework 中,建议程序员将 自定义映射规则配置在 Hoa.Application.ManualMapper.cs中,方便集中管理。

using Mapster;

namespace Hoa.Application
{
    public class ManualMapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<SourceObject, DestinationObject>()
                .Map(dest => dest.FullName,
                     src => string.Format("{0} {1}", src.FirstName, src.LastName));

            config.ForType<DestinationObject, SourceObject>()
                .Map(dest => dest.Gender,
                     src => src.GenderString);
                     
            config.ForType<SourceObject, DestinationObject>()
                .Map(dest => dest.FullName, src => "Sig. " + src.FullName, srcCond => srcCond.Country == "Italy")
                .Map(dest => dest.FullName, src => "Sr. " + src.FullName, srcCond => srcCond.Country == "Spain")
                .Map(dest => dest.FullName, src => "Mr. " + src.FullName);
        }
    }
}

特殊映射

配置Hoa.Application.ManualMapper.cs如下:

using Mapster;
using System.Text;

namespace Hoa.Application.Authorization.Dtos
{
    public class Mapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<SignInInput, SignInInput2>()
                .ConvertSourceMemberUnderlineSplitNameToCamelCase();    // 支持:GROUP_ID -> GroupId 方式

            config.ForType<SignInInput2, SignInInput>()
                .ConvertSourceMemberCamelCaseNameToUnderlineSplit();    // 支持:GroupId -> GROUP_ID 方式
        }
    }
}

数据库实体映射说明

将 EF Core 查询的结果集映射到 Dto 中。

using (MyDbContext context = new MyDbContext())
{
    // 不使用 Mapster 时候
    var destinations = context.Sources.Select(c => new Destination {
        Id = p.Id,
        Name = p.Name,
        Surname = p.Surname,
        ....
    })
    .ToList();
}
using (MyDbContext context = new MyDbContext())
{
    // 使用 Mapster 后
    var destinations = context.Sources.ProjectToType<Destination>().ToList();
}

将 Dto 映射到已存在的 Entity

var entity = _testRepository.GetFirstOrDefault(predicate: u =>u.Id == 1);
var dto = new Dto() { Name = "Monk", Age = 27};
dto.Adapt(entity);  // 这时,Entity会自动更新 Name和Age属性,其他的保持不变

注意 如果 Dto 中某些值为 Null,默认也会将 Null值更新到 Entity,这可能不是我们想要的!!!所以,我们需要手动配置一下,Null 值不需要映射。

config.ForType<Dto, Entity>()
    .IgnoreNullValues(true);
上一页七、控制器和服务下一页九、数据库操作指南

最后更新于4年前

这有帮助吗?

正是由于传统组件带来的漏洞及效率低下问题,所以就有第三方开发者提供了解决方案,在众多的解决方案中,无外乎 和 最为出色。

由于 简单易用,而且性能极高,所以 Hoa Framework 将 Mapster 作为默认的映射组件。

更多自定义映射规则。

Hoa Framework 内置了将类似 GROUP_ID->GroupId和GroupId->GROUP_ID两种映射方式,这是 默认不具备的功能。

传统模式(不推荐):

使用 之后(推荐):

更多 。

🏴
AutoMapper
Mapster
Mapster
可查看官方文档
Mapster
🏴
Mapster
Mapster
可查看官方文档