美文网首页Asp.net开发程序员超级程序猿
automapper如何全局配置map条件过滤null值空值对所

automapper如何全局配置map条件过滤null值空值对所

作者: 邵佳楠 | 来源:发表于2018-03-25 20:30 被阅读78次

    我们在使用automapper的时候经常会遇到这样的问题:假设展示给用户的数据我们用UserDto类,User类就是我们的实体类。在给用户编辑的时候,我们可能某些字段在数据库中为Null,这时候需要一些默认值 比如这里UserDto中的BirTime,然后我们有一些人的习惯是在构造函数里面进行赋值

      public class User
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public  DateTime? BirTime{ get; set; }
        }
    
       public class UserDto
        {
             public UserDto()
            {
                 this.BirTime=DateTime.Now;//把当前时间赋值给BirTime
            }
            public string Name { get; set; }
            public  DateTime? BirTime{ get; set; }
        }
    
     //假设我们从数据库中取出来的值是这样的,然后我们要和UserDto之间进行转换
       User user = new User()
        {
            Id = 1,
            Name = "caoyc",
            BirTime=null
        };
      UserDto userDto=user.MapTo<UserDto>();//这里把实体类转换成前台给用户展示的UserDto类
    

    看似这里的代码都没有什么问题,但是我想在BirTime为null值的时候使用我UserDto类中的默认值 也就是当前时间,但在实际操作之后就会发现转换过后的UserDto的值已经变掉了。那么问题来了, 如何才能使用默认值呢。

    方法有很多,比如

    //第一种方法
    UserDto userDto=user.MapTo<UserDto>();//这里把实体类转换成前台给用户展示的UserDto类
    userDto.BirTime=userDto.BirTime==null?DateTime.Now:userDto.BirTime;
    

    第一种方法就是在自己转换完成之后判断一下,然后重新赋值,用这种方法的话那写构造函数自然就没什么必要了

    //第二种方法
    Mapper.CreateMap<User, UserDto>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
    

    第二种方法不怎么好,当你需要转换的类很多的时候,每个都要这样写,会很多也会很烦

    //第三种方法,在全局配置的时候加上这句话
    private static void CreateMappingsInternal(IMapperConfigurationExpression cfg)
    {
         //没错就是这句话
         cfg.ForAllMaps((a, b) => b.ForAllMembers(opt => opt.Condition((src, dest, sourceMember) => sourceMember != null)));
    }
    

    个人比较推荐第三种方法,不过这就相当于一棒子打死了,有利也有弊。

    当然还有其它方法,我就把我自己想到的方法写出来了

    相关文章

      网友评论

        本文标题:automapper如何全局配置map条件过滤null值空值对所

        本文链接:https://www.haomeiwen.com/subject/eodkcftx.html