【ASP.NET】使用模型映射工具AutoMapper映射DataModel和Dto

在沒有使用其他映射工具時,我們在多模型項目中,轉換模型都是直接手寫代碼,模型多的話,一個一個寫很麻煩。

比如在DataModel轉Dto,或者在Dto轉ViewModel中,我們可以使用模型映射工具,模型自動映射。比如使用AutoMapper。

 

我們先創建幾個模型

用戶信息(DataModel)

public class UserInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
    public bool IsDeleted { get; set; }
}

用戶信息(Dto)

public class UserInfoDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
}

創建一個數據,模擬從數據庫獲取

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false
};

DataModel轉Dti時,我們這麼寫

UserInfoDto userInfoDto = new UserInfoDto
{
    Id = userInfo.Id,
    Name = userInfo.Name,
    Pwd = userInfo.Pwd,
    Age = userInfo.Age,
};

在項目中,有很多模型轉換的地方,這樣寫很麻煩

 

下面開始使用AutoMapper

在NuGet下載AutoMapper包

 

使用

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false
};


AutoMapper.Mapper.Initialize(m =>
{
    m.CreateMap<UserInfo, UserInfoDto>();
});

UserInfoDto userInfoDto = AutoMapper.Mapper.Map<UserInfoDto>(userInfo);

上面適用於,兩個模型的字段類型都相同

 

如果兩個模型的名稱不同,則需要進行特殊的操作

public class UserInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
    public bool IsDeleted { get; set; }
    public DateTime CreatedTime { get; set; }
}

public class UserInfoDto
{
    public string UserName { get; set; }
    public int Age { get; set; }
    public string CreatedTime { get; set; }
}

例如

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false,
    CreatedTime = DateTime.Now
};

AutoMapper.Mapper.Initialize(m =>
{
    //UserInfo轉UserInfoDto
    m.CreateMap<UserInfo, UserInfoDto>()
    //映射前處理
    .BeforeMap((src, dest) => src.Age += 10)

    //匹配不同的字段名稱
    .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.CreatedTime, opt => opt.MapFrom(src => src.CreatedTime.ToString("yyyy-MM-dd")))

    //映射後處理
    .AfterMap((src, dest) => dest.UserName = "姓名:" + dest.UserName)
    //設置反向映射
    .ReverseMap();
});

UserInfoDto userInfoDto = AutoMapper.Mapper.Map<UserInfoDto>(userInfo);

UserInfo user = AutoMapper.Mapper.Map<UserInfo>(userInfoDto);

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章