1. 程式人生 > >automapper如何全局配置map條件過濾null值空值對所有映射起效

automapper如何全局配置map條件過濾null值空值對所有映射起效

所有 user 人的 block 轉換 tle ati 重新 進行

原文 automapper如何全局配置map條件過濾null值空值對所有映射起效

我們在使用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)));
}

個人比較推薦第三種方法,不過這就相當於一棒子打死了,有利也有弊。



作者:邵佳楠
鏈接:https://www.jianshu.com/p/c691a20adf2b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

automapper如何全局配置map條件過濾null值空值對所有映射起效