• 使用Mapster实现双向映射,解放搬砖体力活


    经常会有对象属性互相赋值的操作,但是频繁的写实在是搬运工一样,比较难受比如下面两个类

    1. public class AgencyBdm
    2. {
    3. public new int Id { set; get; }
    4. public string AgencyId { set; get; }
    5. public string AgencyName { set; get; }
    6. public string Region { set; get; }
    7. public string Bdm { set; get; }
    8. public string BdmEmail { set; get; }
    9. public string Dosm { set; get; }
    10. public string DosmEmail { set; get; }
    11. public DateTime CreateDate { get; set; }
    12. public string Modifier { get; set; }
    13. public string Creator { get; set; }
    14. public DateTime? UpdateDate { get; set; }
    15. public List<string> Errors { get; set; } = new List<string>();
    16. public int RowNumber { get; set; }
    17. }
    18. public class AgencyContactModel
    19. {
    20. public string AGENCYID { get; set; }
    21. public string AGENCY_NAME { get; set; }
    22. public string REGION { get; set; }
    23. public string BDM { get; set; }
    24. public string BDM_EMAIL { get; set; }
    25. public string DOSM { set; get; }
    26. public string DOSM_EMAIL { set; get; }
    27. public DateTime CreateDate { set; get; }
    28. }

    他需要一个个的赋值操作

    1. var model = new AgencyContactModel();
    2. var dbModel = new AgencyBdm {
    3. ....此次赋值省略
    4. }
    5. model.Id = dbModel.Id;
    6. model.AGENCYID = dbModel.AgencyId;
    7. model.AGENCY_NAME = dbModel.AgencyName;
    8. model.REGION = dbModel.Region;
    9. model.BDM = dbModel.Bdm;
    10. model.BDM_EMAIL = dbModel.BdmEmail;
    11. model.DOSM = dbModel.Dosm;
    12. model.DOSM_EMAIL = dbModel.DosmEmail;

    然而这还不够,我们经常还需要反向操作赋值

    dbModel.AgencyId = model.AGENCYID;

    这样的体力活着实让人乏累,也许很多人说可以用AutoMapper,但是AutoMapper 仍然不能让我感到满意,AutoMapper 的代码我就不写了,我们使用Mapster,个人觉得很轻巧,很好用。下面以一个在 Asp.net MVC 的Controller 为例,去设置两个对象属性的双向映射关系

    1. public class SellOutPlanController : Controller
    2. {
    3. // 之所以用静态构造函数是因为只会执行一次,TypeAdapterConfig 执行多次时候报错的
    4. static SellOutPlanController()
    5. {
    6. // 设置对象的双向映射,TwoWays就表示双向映射
    7. TypeAdapterConfig
    8. .NewConfig()
    9. .TwoWays()
    10. .Map(dto => dto.Id, poco => poco.Id)
    11. .Map(dto => dto.AGENCYID, poco => poco.AgencyId)
    12. .Map(dto => dto.AGENCY_NAME, poco => poco.AgencyName)
    13. .Map(dto => dto.REGION, poco => poco.Region)
    14. .Map(dto => dto.BDM, poco => poco.Bdm)
    15. .Map(dto => dto.BDM_EMAIL, poco => poco.BdmEmail)
    16. .Map(dto => dto.DOSM, poco => poco.Dosm)
    17. .Map(dto => dto.DOSM_EMAIL, poco => poco.DosmEmail)
    18. .Map(dto => dto.CreateDate, poco => poco.CreateDate);
    19. }
    20. // 然后我们到 Action 下面来使用咯,把 AgencyContactModel 拷贝到 AgencyContactModel 对象
    21. public ActionResult ModelSwitch1()
    22. {
    23. var model = new AgencyContactModel();
    24. var dbModel = new AgencyBdm {
    25. ...此处赋值省略
    26. }
    27. model = dbModel.Adapt();
    28. ... 返回结果省略
    29. }
    30. // 然后下面的倒过来,把 AgencyContactModel 拷贝到 AgencyContactModel
    31. public ActionResult ModelSwitch2()
    32. {
    33. var dbModel = new AgencyBdm();
    34. var model = new AgencyContactModel{
    35. ...此处赋值省略
    36. }
    37. dbModel = model .Adapt();
    38. ... 返回结果省略
    39. }
    40. }

    可以看到,无论是对象A拷贝到对象B,还是对象B拷贝到对象A,只用配置一次就可以了,跟AutoMapper 的代码量我就不去对比,反正用过的都说香,再也不想用AutoMapper了,唯一一点就是这个库的知名度还赶不上AutoMapper

  • 相关阅读:
    移植RTOS的大体思路
    grid 布局 grid-column-gap 使用后内容超出网格
    SFI立昌ML-E应用与方案
    C++ unique_ptr
    用JAVA语言编写下面程序
    【网络原理】初始网络,了解概念
    web前端期末大作业 html+css学生心理 7页主题网页设计
    FFMpeg AVBufferPool 的理解与掌握
    二、准备开发与调试环境
    muduo库的高性能日志库(四)——LogFile文件
  • 原文地址:https://blog.csdn.net/lee576/article/details/134063815