Nano Hash - криптовалюты, майнинг, программирование

Сопоставьте свойство вложенного списка 2-го уровня со свойством списка первого уровня с помощью автоматического сопоставления

Мне нужна ваша помощь. У меня есть базовый опыт работы с automapper, и все это отлично работает, но так или иначе я не могу сопоставить свое следующее изменение исходного объекта с моим целевым объектом.

Позвольте мне немного объяснить это:
В IUser я добавил свойство "UserDetails", и этот класс содержит свойство List of Guid под названием "Domains".

Я хочу сопоставить это свойство списка второго уровня с моим объектом UserDto, где список свойств guid находится на первом уровне. В приведенном ниже примере сопоставление ключей пользователя работает нормально, но я продолжаю получать значение null для «DomainIds» и не вижу, что я делаю неправильно. Я надеюсь, что вы можете помочь мне

public interface IUser
{
    UserKey Key { get; }
    UserDetails Details { get; set; }
    FirstName { get; }
}

public struct UserKey
{
    private readonly Guid _id;
    public UserKey(Guid id)
    {
        _id = id;
    }
}

public class UserDetails
{
    public List<Guid> Domains { get; set; }
}

public class UserDto
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public List<Guid> DomainIds { get; set; }
}

Настройка отображения следующая:

CreateMap<IUser, UserDto>()
            .ForMember(
                dest => dest.Id,
                opt => opt.MapFrom(src => src.Key.Id))
            .ForMember(
                dest => dest.DomainIds,
                opt => opt.MapFrom(src => src.Details.Domains))

В моем тесте я сопоставляю пользователя (который является IUser) следующим образом. К вашему сведению, все остальные свойства отображаются нормально

_mapper.Map<UserDto>(user);

  • Я никогда не использую AutoMapper для нетривиальных отображений. Некоторые методы FromDto и ToDto [расширения] просто проще, быстрее, проще в отладке и более чувствительны к изменениям кода. Сопоставление между различными макетами классов приводит к практически такому же объему кода (или даже большему количеству лямбда-выражений), что и простое написание сопоставления вручную. См. также: cezarypiatek.github.io/post/why-i- не использовать автосопоставление 15.12.2018
  • Если вы можете изменить имена, вы можете получить более четкое сопоставление, используя выравнивание по умолчанию. 15.12.2018
  • @taffer Спасибо. Я прочитал сообщение в блоге, и у него есть несколько веских причин. Я удалил автомаппер и создал свои собственные мапперы. теперь все работает нормально. 15.12.2018

Ответы:


1

Ваше сопоставление, похоже, отлично работает для меня:

Mapper.Initialize(config =>
{
    config.CreateMap<User, UserDto>()
        .ForMember(
            dest => dest.Id,
            opt => opt.MapFrom(src => src.Key.Id))
        .ForMember(
            dest => dest.DomainIds,
            opt => opt.MapFrom(src => src.Details.Domains));
});

var user = new User
{
    FirstName = "foo",
    Key = new UserKey { Id = Guid.NewGuid() },
    Details = new UserDetails
    {
        Domains = new List<Guid> { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() },
    },
};

var result = Mapper.Map<UserDto>(user);

Использование следующих типов:

public class User
{
    public UserKey Key { get; set; }
    public UserDetails Details { get; set; }
    public string FirstName { get; set; }
}
public class UserKey
{
    public Guid Id {get;set;}
}
public class UserDetails
{
    public List<Guid> Domains { get; set; }
}

public class UserDto
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public List<Guid> DomainIds { get; set; }
}
15.12.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..