Каковы преимущества использования Autopper? - PullRequest
6 голосов
/ 22 октября 2010

Мой вопрос может быть глупым, но я уверен, что пропустил очень важную часть вопроса.Я должен сделать какое-то сопоставление объекта с объектом (между классами домена, используемыми в проекте C #, и классами, которые отправляются флеш-клиентам).

Моим первым выбором был Automapper.Но у меня были некоторые проблемы с этим (вложенные свойства, не определяемый конструктор без параметров).Оказывается, что не так просто отобразить действительно сложный тип с помощью автоматического средства.

Тогда мой вопрос: почему бы не реализовать такие методы, как:

  ClassA GetClassAByClassB(ClassB pObj)

   {  
     ClassA objA = new ClassA();  
     objA.Prop1 = pObj.Prop1;  
     objA.NestedType.Prop2 = pObj.Prop2;  
     //....Some more.....  
     return objA;  
   }  

Он имеет точно такой же уровеньгибкости, как отображение сделано с помощью Automapper.Вы все еще должны указать, какое свойство из исходного объекта копируется в какие свойства объекта назначения.Вы просто делаете это, используя '=', а не лямбда-выражение.

Но если вы что-то изменили в своих классах домена, вам все равно придется изменить эту часть "отображения".Итак, что является главным, что должно убедить меня в использовании Automapper (как я уже говорил в начале, я почти уверен, что упускаю что-то важное).

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Поскольку с AutoMapper вам не нужно реализовывать эти методы; -)

Ваш подход требует много написания

classA.propA = classB.propA;
classA.propB = classB.propB;
classA.propC = classB.propC;
classA.propD = classB.propD;
classA.propE = classB.propE;

AutoMapper использует условные обозначения, чтобы понять это сам. Более того, вам не нужно беспокоиться о pObj == null (ваш код будет выбрасывать NulLReferenceException в этом случае).

Вы также можете определять преобразования на своей карте (т. Е. Строка в DateTime).

Mapper.CreateMap<User, UserModel>().ForMember(d => d.LastLogin, c => c.MapFrom<DateTime?>(u => u.Credential.LastLogin));

AutoMapper также поддерживает вложенные свойства.

Подробнее здесь: Введение в AutoMapper и образцы

2 голосов
/ 20 января 2017

Единственное преимущество, которое, как утверждает AutoMapper, заключается в сопоставлении по соглашению.Вот цитата из «Введение и примеры AutoMapper»

«В этом и заключается прелесть AutoMapper. Когда ваши классы выровняются традиционным образом, конфигурация сопоставления может быть настолько простой»1006 *

Это преимущество предоставляется за отдельную плату.Переименование или изменение как свойства target, так и свойства source нарушит отображение и приведет к ошибкам времени выполнения, а не к ошибкам компиляции.

Если вы не можете полагаться на условное отображение, AutoMapper теряет свое преимущество.В этом случае я бы предпочел написать фабричную функцию, как показано ниже.

public static ClassA MapToClassA(this ClassB b)
{
    return new ClassA()
    {
        propA = b.propA;
        propB = b.propB;
        propC = b.propC;
    }
}

Тогда вы бы сконструировали целевой объект как

var classA = classB.MapToClassA();

вместо

var classA = Mapper.Map<ClassB, ClassA>(classB)

Лично я предпочел бы фабричные функции, даже если условное отображение возможно из-за его явности, удобочитаемости и удобства отладки.Удачи при попытке выяснить, во втором случае, как ClassB отображается на ClassA, загружен ли профиль отображения, или почему существует исключение при вызове функции Map <> (), или почему некоторые свойствабыло присвоено неправильное значение.

0 голосов
/ 30 апреля 2018

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

...