mapping - 源复杂时将域类展平到 ViewModel
问题描述
我正在使用 ValueInjecter 将域类映射到我的视图模型。我的域类很复杂。借用这个问题的一个例子:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
// VIEW MODEL
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int PersonId { get; set; }
public int AddressId { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
我看过 FlatLoopInjection,但它希望视图模型类以嵌套域模型类型为前缀,如下所示:
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Id { get; set; }
public int AddressId { get; set; }
public string AddressCity { get; set; }
public string AddressState { get; set; }
public string AddressZip { get; set; }
}
链接问题中的 OP 更改了他的视图模型以匹配 FlatLoopInjection 预期的约定。我不想那样做。如何将我的域模型映射到原始的无前缀视图模型?我怀疑我需要重写 FlatLoopInjection 以删除前缀,但我不确定在哪里执行此操作。我查看了 FlatLoopInjection 的源代码,但我不确定是否需要更改 Match 方法或 SetValue 方法。
解决方案
你不需要展平,先添加地图:
Mapper.AddMap<Person, PersonViewModel>(src =>
{
var res = new PersonViewModel();
res.InjectFrom(src); // maps properties with same name and type
res.InjectFrom(src.Address);
return res;
});
之后您可以致电:
var vm = Mapper.Map<PersonViewModel>(person);
推荐阅读
- javascript - 使用链接的多个 jQuery 动画未按预期工作
- kotlin - 如何在数组 Kotlin 中获取特定值的大小
- python - 收到错误代码:SubscriptionNotFound 消息:尝试获取有关 Azure 虚拟机的数据时未找到订阅?
- c# - 进行 api 调用时出现 Google.Cloud.AutoML.V1 错误
- spring - 未加载静态资源
- java - 如何修复 NoClassDefFoundError?
- swagger - Jhipster 中不生成 Swagger UI
- matrix - 如何生成具有特定对称条目概率的随机稀疏矩阵?
- python - 从另一个文件导入一个 pd.read_sql() DataFrame 以进一步处理它
- laravel - 仅对 Laravel 集合中的记录子集的急切加载关系