如何使用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; }
}
有几个问题:
List<Role>
映射到List<RoleModel>
答案 0 :(得分: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映射。在这种情况下,您似乎需要启用深层复制,并且根据类(s)定义,您可以直接复制它或执行一些自定义映射。
ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
答案 1 :(得分: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<,>))));
使用带自定义转换器的Flatterning配置时出现问题,请查看我的问题:Emit Mapper Flattering with Custom Converters