Правила использования AutoMapper в .NET
Конфигурация
✔ Используйте инициализировать AutoMapper один раз в Mapper.Initialize в AppDomain startup в устаревшем ASP.NET
✔ Используйте использовать пакет AutoMapper.Extensions.Microsoft.DependencyInjection в ASP.NET Core с services.AddAutoMapper(assembly[])
Х Не используйте CreateMap на каждый запрос
Х Не используйте inline maps
✔ Используйте конфигурацию маппингов в профайле
✔ Рассмотрите организацию классов профайлов близко к типам назначения, которые они настраивают (иными словами в UserProfile должны быть маппинги классов связанных с юзером)
Х Не используйте доступ к статичному Mapper классу внутри профайла
Х Не используйте DI контейнер для регистрации всех профилей
Х Не используйте инджект зависимостей в профайлы
✔ Рассмотрите использование параметров конфигурации поддерживаемых LINQ, по сравнению с параметрами, не поддерживаемыми LINQ
Х Избегайте before/after map конфигурацию
Х Не размещайте логику которая строго не относится к поведению при маппинге данных
Х Не используйте MapFrom, когда элемент и так может быть автоматически смаплен
Х Не используйте AutoMapper, за исключением случаев, когда тип назначения представляет собой уплощенное подмножество свойств типа источника
Х Не используйте AutoMapper для поддержки сложной многоуровневой архитектуры
Х Избегайте использования AutoMapper, когда у вас значительный процент конфигурации прописан в форме Ignore или MapFrom
Моделирование
✔ Используйте не большие DTO
Х Избегайте совмесное использование DTO между маппингами
✔ Необходимо создавать внутренние типы в DTO для типов элементов, которые не могут быть сведены
Х Не создавайте DTO с "circular" ассоциациями
Х Избегайте изменения имен членов DTO для управления сереализацией
✔ Следует помещать общие простые "computed property" в source модель
✔ Следует помещать "computed property" которые специфичны для dest модели в dest модель
Выполнение
✔ Рассмотрите возможность использования query projection поверх in-memory mapping'a
Х Не абстрагируйте и не инкапсулируйте mapping за интерфейсом
✔ Необходимо использовать mapping опции для runtime-resolved значений в проекциях.
✔ Используйте опции mappinga для разрешения контекстуализированных сервисов в in-memory mapping'e