Сведение класса предметной области к 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.


person Louise Eggleton    schedule 19.04.2019    source источник


Ответы (1)


вам не нужно выравнивание, сначала добавьте карту:

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);
person Omu    schedule 20.04.2019
comment
Спасибо. За деревьями не видно леса. - person Louise Eggleton; 20.04.2019
comment
Хотя это работает, на практике мои модели более сложны, иногда состоят из более чем одного подобъекта, поэтому сопоставление содержит достаточное количество ручного кода для сопоставления подклассов. Я могу попробовать создать инъекцию, которая сопоставляет свойства с тем же именем и типом, даже если исходные свойства вложены. Часть кода в FlatLoopInjection выглядит многообещающе для этого. - person Louise Eggleton; 20.04.2019
comment
имейте в виду, что вы можете вызвать Mapper.Map внутри AddMap - person Omu; 20.04.2019
comment
Спасибо. Я задавался этим вопросом и собирался попробовать. Спасибо за создание этого Mapper. - person Louise Eggleton; 21.04.2019