#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. Не могли бы вы уточнить, что означает «не работает»? Вы получаете исключения? Синтаксические ошибки?
Ответ №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>();
});
Это работает как шарм 🙂