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

文章讲述了在.NET开发中,如何通过Mapster库简化对象属性的频繁赋值操作,尤其是实现双向映射,减少代码量,相比于AutoMapper更易用。作者以Asp.netMVC的Controller为例,展示了Mapster在对象复制中的优势。
摘要由CSDN通过智能技术生成

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

    public class AgencyBdm 
    {
        public new int Id { set; get; }
        public string AgencyId { set; get; }
        public string AgencyName { set; get; }
        public string Region { set; get; }
        public string Bdm { set; get; }
        public string BdmEmail { set; get; }
        public string Dosm { set; get; }
        public string DosmEmail { set; get; }
        public DateTime CreateDate { get; set; }
        public string Modifier { get; set; }
        public string Creator { get; set; }
        public DateTime? UpdateDate { get; set; }
        public List<string> Errors { get; set; } = new List<string>();
        public int RowNumber { get; set; }
    }

    public class AgencyContactModel
    {
        public string AGENCYID { get; set; }
        public string AGENCY_NAME { get; set; }
        public string REGION { get; set; }
        public string BDM { get; set; }
        public string BDM_EMAIL { get; set; }
        public string DOSM { set; get; }
        public string DOSM_EMAIL { set; get; }
        public DateTime CreateDate { set; get; }
    }

他需要一个个的赋值操作

            var model = new AgencyContactModel();
            var dbModel = new AgencyBdm {
               ....此次赋值省略
            }
            model.Id = dbModel.Id;
            model.AGENCYID = dbModel.AgencyId;
            model.AGENCY_NAME = dbModel.AgencyName;
            model.REGION = dbModel.Region;
            model.BDM = dbModel.Bdm;
            model.BDM_EMAIL = dbModel.BdmEmail;
            model.DOSM = dbModel.Dosm;
            model.DOSM_EMAIL = dbModel.DosmEmail;
            

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

dbModel.AgencyId = model.AGENCYID;

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

    public class SellOutPlanController : Controller
    {
        // 之所以用静态构造函数是因为只会执行一次,TypeAdapterConfig 执行多次时候报错的
        static SellOutPlanController()
        {
            // 设置对象的双向映射,TwoWays就表示双向映射
            TypeAdapterConfig<AgencyBdm, AgencyContactModel>
                    .NewConfig()
                    .TwoWays()
                    .Map(dto => dto.Id, poco => poco.Id)
                    .Map(dto => dto.AGENCYID, poco => poco.AgencyId)
                    .Map(dto => dto.AGENCY_NAME, poco => poco.AgencyName)
                    .Map(dto => dto.REGION, poco => poco.Region)
                    .Map(dto => dto.BDM, poco => poco.Bdm)
                    .Map(dto => dto.BDM_EMAIL, poco => poco.BdmEmail)
                    .Map(dto => dto.DOSM, poco => poco.Dosm)
                    .Map(dto => dto.DOSM_EMAIL, poco => poco.DosmEmail)
                    .Map(dto => dto.CreateDate, poco => poco.CreateDate);
        }

        // 然后我们到 Action 下面来使用咯,把 AgencyContactModel 拷贝到 AgencyContactModel 对象
        public ActionResult ModelSwitch1()
        {
           var model = new AgencyContactModel();
           var dbModel = new AgencyBdm {
               ...此处赋值省略
           }
           model = dbModel.Adapt<AgencyContactModel>();
           ... 返回结果省略
        }
        
        // 然后下面的倒过来,把 AgencyContactModel 拷贝到 AgencyContactModel 
        public ActionResult ModelSwitch2()
        {
           var dbModel = new AgencyBdm();
           var model = new AgencyContactModel{
               ...此处赋值省略
           }
           dbModel = model .Adapt<AgencyBdm>();
           ... 返回结果省略
        }
     } 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值