簡體   English   中英

基於Automapper約定的映射進行收集

[英]Automapper convention based mapping for collection

我有一個項目,正在嘗試將字典映射到ViewModel.NamedProperty。 我正在嘗試使用AutoMapper自定義解析器執行基於約定的映射。 我的約定是,如果源字典鍵存在指定的屬性,則從字典的值映射一個屬性。 這是我的示例類:

class User
{
   string Name {get;set;}
   Dictionary<string, AccountProp> CustomProperties {get;set;}
}

class AccountProp
{
   string PropertyValue {get;set;}
   //Some other properties

}

class UserViewModel
{
   string Name {get;set;}
   DateTime LastLogin {get;set;}
   string City {get;set}
}

var user = new User()
{
   Name = "Bob"   
};

user.CustomProperties.Add("LastLogin", new AccountProp(){PropertyValue = DateTime.Now};
user.CustomProperties.Add("City", new AccountProp(){PropertyValue = "SomeWhere"};

我想按慣例將所有屬性的User CustomProperties字典映射到展平的UserViewModel,並且我不想為映射單獨指定每個屬性。

最好的方法是什么? 我當時在考慮自定義值解析器,但似乎必須指定要單獨映射的每個成員。 如果要這樣做,我將在沒有AutoMapper的情況下手動執行映射。

以下是達到目的的代碼。 不確定它是否好。

Mapper.CreateMap<User, UserViewModel>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))                // Optional
    .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.CustomProperties.FirstOrDefault(x => x.Key == "City").Value.PropertyValue.ToString()))  // Handle null
    .ForMember(dest => dest.LastLogin, opt => opt.MapFrom(src => Convert.ToDateTime(src.CustomProperties.FirstOrDefault(x => x.Key == "LastLogin").Value.PropertyValue)));  //Handle null

我最終創建了一個自定義類型轉換器來處理這種情況,並且效果很好:

public class ObjectToPropertyTypeConverter<TFromEntity> : ITypeConverter<TFromEntity, HashSet<Property>>
{
 //perform custom conversion here
}

然后,我實現了自定義映射,如下所示:

 AutoMapper.Mapper.CreateMap<MyViewModel, HashSet<Property>>()
               .ConvertUsing<ObjectToPropertyTypeConverter<MyViewModel>>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM