Есть ли способ сопоставить список со скалярным свойством с помощью автоматического сопоставления? - PullRequest
1 голос
/ 06 марта 2020

В моем бизнес-уровне у меня есть следующие объекты

class ParentClass
{
    // Parent class properties
    ChildClass PrimaryChild { get; set; }
    ChildClass SecondaryClass { get; set; }
}

class ChildClass
{
    //Child class properties
}

Бизнес-правила предписывают, что в DAL будут только основной и дополнительный дочерние элементы

, хотя это имело смысл установить это как стандартное отношение один ко многим

class ParentEntity
{
    // Parent properties
    IEnumerable<ChildEntity> Children { get; set; }
}

class ChildEntity
{
    // Child properties

    bool IsPrimary { get; set; }

    int ParentId { get; set; }
    ParentEntity Parent { get; set; }
}

Это хорошо работает для базы данных и обеспечивает гибкость в будущем в случае изменения бизнес-правил.

Это все работает хорошо, но я обнаружил, что вручную сопоставляю свойства PrimaryChild и SecondaryChild на бизнес-уровне, в то время как все остальное сопоставляется с помощью automapper. отображение? Мне не повезло найти пример, который следует этой структуре.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Насколько я знаю, это не может быть сделано неявным образом.

Даже если бы существовала возможность неявного выполнения этого, это потребовало бы от вас явного указания:

  • Свойства, которые должны быть отображены в список
  • Как установить флаг IsPrimary в зависимости от того, какое из этих свойств
  • (для двусторонней привязки) Какой элемент списка следует сопоставить, какое свойство

В качестве простого примера того, насколько сложным оно может быть: что, если в вашем списке есть несколько дочерних элементов, но нет , которые были помечены как основные? Как бы вы неявно знали, что делать?

Как только вы уже приступили к написанию этих пользовательских битов логики c, вы, по сути, переписали все ваше ручное отображение, и фреймворк не стал бы действительно делать многое другое, чем выполнение ваших шагов, написанных вручную.

Это был бы целый код, который действительно не добавляет ценности к функциональности библиотеки.

1 голос
/ 06 марта 2020

Ну, это можно сделать с помощью чего-то вроде:

.ForMember(dest => dest.PrimaryChild ,
            opt => opt.MapFrom(src => src.Children.FirstOrDefault(c => c.IsPrimary)))

.ForMember(dest => dest.SecondaryClass,
            opt => opt.MapFrom(src => src.Children.FirstOrDefault(c => !c.IsPrimary)))

Но это зависит от того, соответствуют ли исходные данные тому, как вы их объяснили, и свойству IsPrimary, установленному в точке отображения.

Лучше изменить ParentClass для хранения коллекции ChildClass, если это практически возможно, поэтому вы получите прямое сопоставление, которое будет обрабатывать несоответствия данных, которые вы можете впоследствии отфильтровать при необходимости.

...