Свести класс домена к ViewModel, когда источник сложен - PullRequest
1 голос
/ 19 апреля 2019

Я использую 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; } 

}

ОП в связанном вопросе изменил свои модели представления в соответствии с соглашением, ожидаемым FlatLoopInjection.Я не хочу этого делать.Как я могу сопоставить мою модель домена с исходной моделью без префикса представления?Я подозреваю, что мне нужно переопределить FlatLoopInjection, чтобы удалить префикс, но я не уверен, где это сделать.Я посмотрел на источник FlatLoopInjection, но не уверен, нужно ли мне изменить метод Match или метод SetValue.

1 Ответ

1 голос
/ 20 апреля 2019

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

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