2012-03-08 71 views
1

如何使用Emit Mapper將User類映射到UserModel類?發送映射器奉承和屬性名稱不匹配

public class User 
    { 
     public Guid Id { get; set; } 

     public string FirstName { get; set; } 

     public string LastName { get; set; } 

     public IList<Role> Roles { get; set; } 

     public Company Company { get; set; }   
    } 

    public class UserModel 
    { 
     public Guid Id { get; set; } 

     public Guid CompanyId { get; set; } 

     public string FirstName { get; set; } 

     public string LastName { get; set; }  

     public IList<RoleModel> Roles { get; set; } 
} 

有幾個問題:

  • 我需要拼合的對象,這樣我會有CompanyId,而不是公司的對象。
  • 公司對象具有屬性Id,在UserModel中我有CompanyId,它對應於公司id,但屬性名稱不匹配。
  • 我需要映射到List<Role>List<RoleModel>
+0

我有一個類似的問題...你解決這個問題? – fra 2012-05-17 17:39:03

回答

0
  • 對於奉承我是用配置在的Emit映射源文件的樣本:http://emitmapper.codeplex.com/SourceControl/changeset/view/69894#1192663

  • 爲了讓名字在公司類匹配應該是字段名稱Id

  • 對於映射List<Role>List<RoleModel>我使用的是自定義轉換器:

    public class EntityListToModelListConverter<TEntity, TModel> 
    { 
        public List<TModel> Convert(IList<TEntity> from, object state) 
        { 
         if (from == null) 
          return null; 
    
         var models = new List<TModel>(); 
         var mapper = ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TModel>(); 
    
         for (int i = 0; i < from.Count(); i++) 
         { 
          models.Add(mapper.Map(from.ElementAt(i))); 
         } 
    
         return models; 
        } 
    } 
    

    所以一起:

    var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
          new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
          new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>)))); 
    
  • 這裏有一個問題,使用Flatterning配置使用自定義轉換器,檢查我的問題:Emit Mapper Flattering with Custom Converters

+0

謝謝,這解決了我的問題。 無論如何,它仍然不清楚我應該如何指定TEntity和TModel應映射的方式...我們假設我有A類型的集合類型B,我想將它映射到AMapped與一個BMapped的集合...我應該如何設置配置?我應該使用PostProcess嗎? 我真的很喜歡這個圖書館的想法,但它真的錯過了配置和例子...... – fra 2012-05-19 14:00:55

+0

這取決於集合的類型。在我的例子中,我有一個泛型集合,所以我使用了一個通用類型的定製轉換器http://emitmapper.codeplex.com/wikipage?title=Customization%20using%20default%20configurator&referringTitle=Documentation&ANCHOR#Custom_converters_for_generics。你需要提供自定義的轉換器,用於從B轉換爲BMapped,在泛型的情況下,你會註冊爲新的FlatteringConfig()。ConvertGeneric(typeof(B),typeof(BMapped),new DefaultCustomConverterProvider(typeof(CustomConverterClass))) ' – 2012-05-19 15:11:41

+0

在'Convert'方法中,我通過像'var mapper = ObjectMapperManager.DefaultInstance.GetMapper ();'一樣創建映射器,然後調用'Map'方法將'Role'的每個項映射到'RoleModel'在每個項目上添加返回值到模型集合 – 2012-05-19 15:16:03

1

若要扁平化模型,你可以檢查this example。但是,它似乎默認情況下具有將子類屬性名稱作爲目標前綴的約定。

來源

public class SourceObject 
{ 
public SourceSubObject SomeClass { get; set; } 
} 

public SourceSubObject 
{ 
    public int Age { get; set; } 
} 

目標

public class Target 
{ 
public int SomeClassAge { get; set; } 
} 

其次,一個選項是讓默認設置複製,它可以複製和手動完成這些屬性其餘

var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>().Map(source); 
target.CompanyId = target.Company.CompanyId; 

或者,如果您需要重用的映射創建自定義映射

自定義映射

private Target Converter(Source source) 
{ 
    var target = new Target(); 
    target.CompanyId = source.Company.CompanyId; 
    return target; 
} 

使用

var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter); 
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source); 

更新

什麼談到角色& RoleModel映射。在這種情況下,您似乎需要啓用Deep Copy,並根據類別定義,您可以直接複製它,或者執行一些自定義映射。

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target); 
相關問題