Отображение сложных унаследованных моделей с помощью Automapper

#c# #.net-core #automapper

#c# #.net-ядро #automapper

Вопрос:

Я работаю над своим приложением .NET Core 3.0, и мне нужно сопоставить мою модель с другой моделью с помощью Automapper (у меня есть ddl-ы, и мне нужно использовать эти библиотеки).

Моя модель (исходная модель) имеет следующую структуру:

 public class ProfessorModel {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Profession { get; set; }
    public string JobId { get; set; }
}

public class UniversityMembersModel {
    public IEnumerable<ProfessorModel> People { get; set; }
}
 

Целевая модель следующая:

 public interface Identificator {
    int Id { get; }
}

public interface IPerson : Identificator {
    string FirstName { get; }
    string LastName { get; }
}

public abstract class TeachingStaff : IPerson, Identificator {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

public class TeachingProfessor : TeachingStaff {
    public string Profession { get; set; }
    public string TeachingSubject { get; set; }
    public string JoblId { get; set; }
}

public class UniversityMembers {
    public IEnumerable<IPerson> People { get; set; }
}
 

Я не смог получить правильное отображение в целевой модели. Я пробовал использовать следующие конфигурации Automapper:

 var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<ProfessorModel, IPerson>(); // <-- does not work

    // does not work:
    cfg.CreateMap<ProfessorModel, IPerson>()
        .ConstructUsing(p => new TeachingProfessor());

    // does not work:
    cfg.CreateMap<ProfessorModel, TeachingProfessor>();

    // does not work:
    cfg.CreateMap<ProfessorModel, TeachingProfessor>()
        .ConstructUsing(p => new TeachingProfessor());
});
 

Ответ, который мне нужен для отображения из исходной в целевую модель, следующий:

 {
    "people": [
        {
            "id": 213,
            "firstName": "John",
            "lastName": "Doe",
            "email": "johny@myUni.edu",
            "profession": "Full time professor Biology",
            "jobId": "J3487H"
        },
        {
            "id:" 928,
            "firstName": "Mary",
            "lastName": "Doe",
            "email": "mary.me@my.uni",
            "profession": "Part time professor Chemistry",
            "jobId": "P3436JJ"
        }
    ]
}
 

Как я могу получить сопоставленную целевую модель из исходной? Я не могу изменить структуру из моей целевой модели, потому что она определена в существующей.библиотека dll.
Я также не нашел никаких решений в документации о унаследованных абстрактных классах и интерфейсах.

Спасибо всем!

Комментарии:

1. Не могли бы вы уточнить, что означает «не работает»? Вы получаете исключения? Синтаксические ошибки?

2. docs.automapper.org/en/latest/Mapping-inheritance.html

Ответ №1:

Я рассмотрел некоторые ответы на StackOverflow и, наконец, пришел к следующему работоспособному решению.

Я создал пользовательский конвертер:

 public class ProfessorIPersonConverter : ITypeConverter<src.Professor, dest.IPerson>
    {
        public IPerson Convert(Professor source, IPerson destination, ResolutionContext context)
        {
            return context.Mapper.Map<src.Professor, dest.TeachingProfessor>(source);
        }
    }
 

который затем был включен в существующую конфигурацию mapper:

 var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<src.Professor, dest.IPerson>()
       .ConvertUsing(new ProfessorIPersonConverter());
    cfg.CreateMap<src.Professor, dest.TeachingProfessor>();
});
 

Это работает как шарм 🙂