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 而不是 Company 对象。
  • 公司对象具有属性 ID,在 UserModel 中我有与公司 ID 对应的 CompanyId,但属性名称不匹配。
  • 我需要映射List<Role>List<RoleModel>
4

2 回答 2

1

要获得扁平模型,您可以查看此示例。但似乎默认情况下,它有一个约定,即在目标中使用子类属性名称作为前缀。

来源

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);

更新

角色和角色模型映射是什么。在这种情况下,您似乎需要启用深层复制,并且根据类定义,您可以直接复制它或进行一些自定义映射。

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
于 2012-03-09T07:54:47.550 回答
0
  • 为了讨人喜欢,我使用了 Emit Mapper 源文件中示例的配置: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<,>))));
    
  • 有一个问题,使用自定义转换器的扁平化配置,检查我的问题:Emit Mapper Flattering with Custom Converters

于 2012-05-17T20:41:10.233 回答