当前位置: 首页 > news >正文

投影投影接口定义

投影接口定义

  • IProjection接口很简单
  • 只有TryConvert一个方法
  • 相同类型对象的转化,返回是否成功以及转化后的结果
  • 约定不符合规则就不转化
  • 一般情况下转化成功的结果会和源对象不同
  • 当然经过多次投影后也可能会和源对象相同了
public interface IProjection<T> { bool TryConvert(T source, out T result); }

2. 三种投影方式

2.1 使用前缀投影来演示
  • 前缀投影就是把成员前面加个前缀来映射
  • sourceMembers模拟对User的反射
  • 通过Projection.Prefix("User")创建一个前缀投影
  • 如果没有User前缀,就增加User
  • 如果有User前缀就不处理
public record User(int Id, string UserName); public record UserDTO(int UserId, string UserName); var sourceMembers = new Dictionary<string, Func<User, object>>() { [nameof(User.Id)] = obj => obj.Id, [nameof(User.UserName)] = obj => obj.UserName }; var projection = Projection.Prefix("User");
2.2 Filter投影的Case
2.2.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Filter(sourceMembers); Assert.Single(result); Assert.True(result.ContainsKey(nameof(UserDTO.UserId)));
2.2.2 sql表示
SELECT Id AS UserId FROM User
2.2.3 影像表示

User

Filter

Id

UserName

UserId

2.3 Through投影的Case
2.3.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Through(sourceMembers); Assert.Equal(sourceMembers.Count, result.Count); Assert.True(result.ContainsKey(nameof(UserDTO.UserId))); Assert.True(result.ContainsKey(nameof(UserDTO.UserName)));
2.3.2 sql表示
SELECT Id AS UserId,UserName FROM User
2.3.3 影像表示

User

Through

Through

Id

UserName

UserId

UserName

2.4 Cross投影的Case
  • PocoEmit.Mapper重构用的就是Cross投影
2.4.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Cross(sourceMembers); Assert.Equal(3, result.Count); Assert.True(result.ContainsKey(nameof(User.Id))); Assert.True(result.ContainsKey(nameof(UserDTO.UserId))); Assert.True(result.ContainsKey(nameof(UserDTO.UserName)));
2.4.2 sql表示
SELECT Id,UserName,Id AS UserId FROM User
2.4.3 影像表示

User

Cross

Cross

Cross

Id

UserName

Id

UserName

UserId

3. 投影支持"横向"扩展

  • 这里说的"横向"就是投影并联
  • 把多个投影组合成多分支的映射规则
  • 通过FirstReturn或ToFirstReturn方法实现
3.1 "横向"扩展的Case
// 包含User或U前缀就去掉前缀 var user = Projection.RemovePrefix("User"); var u = Projection.RemovePrefix("U"); var projection = Projection.FirstReturn(user, u); [Theory] [InlineData("UserId", "Id")] [InlineData("UId", "Id")] [InlineData("UUserName", "UserName")] [InlineData("UserUName", "UName")] public void TryConvert(string source, string expected) { projection.TryConvert(source, out var result); Assert.Equal(expected, result); }
3.2 影像表示"横向"扩展
  • RemoveUser和RemoveU两个并联的投影
  • 并联投影按照顺序依次尝试
  • 直到有一个投影成功了就返回结果

expected

source

RemoveUser

RemoveU

RemoveU

RemoveUser

UserId

UId

UUserName

UserUName

Id

UserName

UName

二、投影在PocoEmit.Mapper中的应用

1. AddPrefix

1.1 AddPrefix的Case
IMapper mapper = Mapper.Create(); mapper.ConfigureMap<AutoUserDTO, User>() .Source .AddPrefix("User"); var source = new AutoUserDTO { UserId = "222", UserName = "Jxj2" }; var converter = mapper.GetConverter<AutoUserDTO, User>(); var result = converter.Convert(source); Assert.NotNull(result); Assert.Equal(source.UserId, result.Id.ToString()); Assert.Equal(source.UserName, result.UserName);
1.2 AddPrefix使用的是去除前缀投影(RemovePrefix)
  • AddPrefix("User")会调用Projection.RemovePrefix("User")来创建一个去除前缀投影
  • AutoUserDTO两个成员分别是UserId和UserName
  • User两个成员分别是Id和UserName
  • 对AutoUserDTO投影的效果相当于sql: SELECT UserId,UserName,UserId AS Id FROM AutoUserDTO
  • 通过这个投影,两边的成员名就能完美匹配上了
1.3 影像演示一下这个过程

User

AutoUserDTO投影

AutoUserDTO

RemoveUser

RemoveUser

Mapping

Mapping

UserId

UserName

UserId

UserName

Id

Name

Id

UserName

1.4 使用前缀投影(Prefix)也可以实现类似的效果
  • 通过Projection.Prefix("User")创建一个前缀投影
  • 这时就需要对User进行投影
  • 对User投影的效果相当于sql: SELECT Id,UserName,Id AS UserId FROM User
http://www.gsyq.cn/news/1588462.html

相关文章:

  • 【2013-10-17】Android应用开发笔记:自定义控件实现LCD显示
  • 大模型和搜索引擎到底有什么不一样
  • 药品追溯码扫码设备怎么选?医药全场景读码硬件技术选型分析
  • 【原创保姆级】OpenAI Codex 全平台安装配置教程(Windows/Mac)避坑完整版
  • 虚拟助手化技术对话管理系统与多轮对话设计
  • 后端别再卷CRUD了,强烈建议直接转Agent开发
  • 3步轻松搞定知网文献批量下载:告别繁琐手动操作的高效方案
  • 面向 IVD 医疗设备精密液体输送的运动物理量反馈速度补偿控制技术研究与工程实现
  • 【IDEA安装黑盒解密】:基于JetBrains官方源码级文档(v2024.1.3 Build #IU-241.14494.242)还原安装流程与签名验证机制
  • AI危险自信的本质与四步事实校验法
  • 终极网盘下载加速指南:LinkSwift直链助手让文件传输飞起来
  • 从大偏差原理到玻色气体自由能:环路与交织图像解析
  • Python毕设项目:基于 Echarts+Python 的图书销售预警监测系统设计与实现 基于 Echarts+Python 的图书经营可视化监测平台 (源码+文档,讲解、调试运行,定制等)
  • Airsonic:自托管音乐流媒体服务器
  • ROS2 SHM 零拷贝 40~50μs 完整延迟拆解
  • Ashby 一体化解决方案:助力不同规模企业招聘,多维度资源对比与支持服务全揭秘
  • 大屏数字人智能交互新方案:语音通话问答 + 一键调取后台数据,重塑线下大屏数字化体验
  • 个人开发小程序与公司开发:哪种方式更适合你?
  • 5分钟实战指南:使用zteOnu高效获取中兴光猫超级管理员权限
  • 专业的花箱护栏制造企业
  • 如何轻松搭建自己的离线翻译服务器:LibreTranslate完全指南
  • 【课程设计/毕业设计】基于 LSTM 学习评估的 Django 线上考试管理系统设计与实现 面向智能测评的 Django+LSTM 在线考试系统设计与实现【附源码、数据库、万字文档】
  • LangGraph 状态管理实战:解锁追加式消息历史,打造流畅对话系统
  • ROS 2 Fast DDS性能调优实战:解锁XML配置、零拷贝与QoS优化
  • 二维抛物方程逆漂移问题:单调迭代重建方法原理与工程实践
  • Django计算机毕设之基于 Django 的智能餐饮推荐查询系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • OWASP ZAP实战:从被动扫描到主动Fuzzing的Web安全测试进阶
  • Python毕业设计-基于 Echarts+Python 的图书零售监测系统设计与实现 基于 Echarts+Python 的图书销售数据可视化(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • GEO 技术文章
  • 群星 银河版下载|官方中文|游牧民族DLC+全DLC+修改器