首页 > 解决方案 > 源复杂时将域类展平到 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 方法。

标签: mappingvalueinjecter

解决方案


你不需要展平,先添加地图:

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

推荐阅读