BestPractice: за и против за использование AutoMapper или LINQ (LINQ to Objects) для сопоставления между моделью предметной области и моделью представления
Как вы думаете? Как вы отображаете между вашим доменом и моделью презентации?
3 ответа
Цитирую часть ответа из другого вопроса Automapper:
Если у вас есть объект одного типа, и вы хотите заполнить свойства объекта другого типа, используя свойства первого типа, у вас есть два варианта:
- Вручную написать код, чтобы сделать такое отображение.
- Используйте инструмент, который автоматически обработает это для вас.
AutoMapper является примером 2.
LINQ to Objects - пример 1 - это просто менее болезненно, чем написание ванильного кода отображения объекта на объект.
С точки зрения плюсов и минусов:
Automapper должен значительно сократить объем кода, который вы должны написать, по сравнению с LINQ, поскольку он использует соглашения для определения отображений по умолчанию. Используя LINQ, эти отображения по умолчанию должны быть определены.
При использовании LINQ необходимо будет определить сопоставления в обоих направлениях - Automapper должен иметь возможность выполнять это автоматически при использовании соглашений.
Как и во всех сторонних dll, использование Automapper создаст другую зависимость и потребует небольшой кривой обучения (обратите внимание, что для тех разработчиков, которые раньше не использовали LINQ, была бы кривая обучения).
Обратите внимание, что Automapper может использоваться в сочетании с LINQ (и LINQ2SQL) - еще одной публикацией Automapper, которая объясняет некоторые тонкости.
Есть также недостатки в использовании AutoMapper, и некоторые из этих недостатков обычно применяются к программированию по соглашению (в отличие от явного написания кода).
Скажем, у вас есть два класса C# -
namespace MyDtoNamespace {
public class MyClass {
public int Id { get; set; }
}}
namespace MyBusinessLayerNamespace {
public class MyClass {
public int Id { get; set; }
}}
AutoMapper будет отображать между этими двумя классами хорошо с небольшой явной конфигурацией требуется.
Но позже, скажем, разработчик рассматривает возможность переименования одного из этих свойств Id во что-то другое, например
namespace MyBusinessLayerNamespace {
public class MyClass {
public int MyNewIdentifierVariableName { get; set; }
}}
Я тщательно ищу ссылки в Visual Studio и рассматриваю влияние переименования на эти ссылки - но поскольку MyDtoNamespace.MyClass.Id не ссылается явно на MyBusinessLayerNamespace.MyClass.Id, я его никогда не вижу.
Когда Visual Studio или другой инструмент автоматически переименовывает все вхождения переменной для меня в решении, отображение AutoMapper прерывается.
Я могу это выяснить только во время выполнения, проблем с компиляцией нет. В идеале у меня есть модульные тесты для проверки работоспособности отображения, как я надеюсь, но даже в этом случае потенциальная вероятность ошибок времени выполнения во время рефакторинга является хорошей причиной, чтобы предпочесть написание явного кода отображения.
Я, конечно, не спорю с тем, чтобы вообще избегать AutoMapper, просто отмечая, что это серьезная проблема программирования по соглашению.
http://bhavinsurela.com/linq-and-automapper-view-model-and-data-model/ может быть то, что вы ищете.