Сопоставление вложенного списка с идентификатором высшего класса ASP.NET core 3 - PullRequest
0 голосов
/ 12 октября 2019

У меня есть два класса:

public class QuizDto
{
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string UserToken { get; set; }
        public List<int> AreasId { get; set; }
        public List<QuizQuestionDto> Questions { get; set; }
}
public class Quiz 
{
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string UserToken { get; set; }
        public List<JoinQuizAndArea> AreasOfQuizzes { get; set; }
        public List<QuizQuestion> Questions { get; set; }
}
public class JoinQuizAndArea
{
        public int QuizId { get; set; }
        public Quiz Quiz { get; set; }
        public int AreaId { get; set; }
        public AreaOfQuiz Area { get; set; }

}
public class AreaOfQuiz
{
        public int Id { get; set; }
        public string Area { get; set; }
        public List<JoinQuizAndArea> AreasOfQuizzes { get; set; }
}

Мне нужно сопоставить QuizDto с Quiz, для этого мне нужно сопоставить эти два свойства:

public class QuizDto
{
        public int Id { get; set; }
        ...
        ...

        public List<int> AreasId { get; set; }
        ...
}

с этими двумя свойствами:

public class JoinQuizAndArea
{
        public int QuizId { get; set; }
        ...
        public int AreaId { get; set; }
        ....
}

Чтобы сделать это, я создал следующий Resolver:

public class CustomResolver : IValueResolver<QuizDto, Quiz, List<JoinQuizAndArea>>
{
    public List<JoinQuizAndArea> Resolve(QuizDto source, Quiz destination, List<JoinQuizAndArea> member, ResolutionContext context)
    {
        var list = new List<JoinQuizAndArea>();
        foreach(var areaId in source.AreasId)
        {
            var joinQuizAndArea = new JoinQuizAndArea();
            joinQuizAndArea.AreaId = areaId;
            joinQuizAndArea.QuizId = source.Id;
            list.Add(joinQuizAndArea);
        }

        return list;
    }
}
interface IValueResolver<in TSource, in TDestination,TDestMember>
{
    TDestMember Resolve(TSource source, TDestination destination, TDestMember destMember, ResolutionContext context);
}

Но когда я пытаюсь настроить профиль сопоставления:

public class QuizProfile:Profile
{
    public QuizProfile()
    {
        CreateMap<Quiz, QuizDto>();
        CreateMap<QuizDto, Quiz>()
                .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title))
                .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
                .ForMember(dest => dest.UserToken, opt => opt.MapFrom(src => src.UserToken))
                .ForMember(dest => dest.AreasOfQuizzes, opt=>opt.MapFrom<CustomResolver>())
                .ForMember(dest => dest.Questions, opt => opt.MapFrom(src => src.Questions));
    }
}

Iполучено сообщение об ошибке:

CS0311 Тип 'QuizzWorld.Mapping.Resolver.CustomResolver' нельзя использовать в качестве параметра типа 'TValueResolver' в универсальном типе или методе 'IMemberConfigurationExpression.MapFrom (). ». Не существует неявного преобразования ссылок из 'QuizzWorld.Mapping.Resolver.CustomResolver' в 'AutoMapper.IValueResolver'. QuizzWorld C: \ Users \ Sohaib \ source \ repos \ QuizzWorld \ Back End \ QuizzWorld Back End \ QuizzWorld \ Mapping \ QuizProfile.cs

плз, у кого-нибудь есть идея, в чем проблемаэто точно ?? Спасибо.

1 Ответ

0 голосов
/ 12 октября 2019

У вас ошибка компилятора, потому что у вас есть собственное определение интерфейса IValueResolver, которое переопределяет интерфейс AutoMapper. Удалите интерфейс IValueResolver или переименуйте его. После этого компиляция должна завершиться успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...