Автоматическое сопоставление вложенных классов с одним DTO - PullRequest
0 голосов
/ 17 февраля 2020

Итак, я создаю веб-приложение с несколькими друзьями, где я создам для него бэкэнд-код. У меня есть несколько моделей, но только одна модель поступает с httppost.

, так что я получил за входящее сообщение http:

    public class LanpartyDto
{
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public string Description { get; set; }

    public Dictionary<DateTime, IList<string>> UsersAvailableForDate { get; set; }

}

public class Lanparty
{
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    public Guid  AvailablityId{ get; set; }

    public IList<Availability> AvailableUsers { get; set; }
}


public class Availability
{

    public Guid Id { get; set; }

    public string DateAvailable { get; set; }

    public IList<string> Name { get; set; }

}

 public AutoMapping()
    {
        CreateMap<Lanparty, LanpartyDto>()
            .ForMember(dest => dest.UsersAvailableForDate, m => m.MapFrom(src => src.AvailableUsers.ToDictionary(k=>k.DateAvailable, v=>v.Name.ToList())));



    }

Так что я могу сопоставить одно dto с несколькими вложенными классы? до сих пор, я думаю, не потому, что я получаю исключение карты и смотрю здесь и на Google, возможно, если я сделаю доступность к также, но я не вижу в этом смысла? Итак, какой мой лучший вариант, попробуйте изменить код внешнего интерфейса, чтобы я мог изменить свой dto? или просто создайте код отображения самостоятельно, поскольку для одного класса это не сложно?

1 Ответ

2 голосов
/ 17 февраля 2020

Сопоставление, которое вы хотите, выглядело бы так:

CreateMap<Lanparty, LanpartyDto>()
    .ForMember(dest => dest.UsersAvailableForDate,
        m => m.MapFrom(src => src.AvailableUsers.ToDictionary(k => k.DateAvailable, v => v.Name)));

CreateMap<LanpartyDto, Lanparty>()
    .ForMember(dest => dest.AvailableUsers,
        m => m.MapFrom(src => src.UsersAvailableForDate.Select(u => new Availability { DateAvailable = u.Key, Name = u.Value })));

Я позволил себе изменить тип свойства Availability.DateAvailable на DateTime, поскольку я не совсем понимаю, почему вы используете строку. Но если вы хотите, чтобы это была строка, просто добавьте ToString() к части u.Key.

...