Автоматический маппинг объектов в .NET — Emitmapper

Главным отличием EmitMapper от AutoMapper по заявлению разработчиков заключается в использовании механизма Reflection Emit. Этот механизм позволяет строить IL-код на лету использовать его. В результате EmitMapper работает на несколько порядков быстрее.

Разработчики EmitMapper написали простенький benchmark, в котором они сравнивают работу EmitMapper, AutoMapper и маппинг объектов руками. Вот что у них получилось на тестовом прогоне:

  • Handwritten Mapper: 80 мс.
  • EmitMapper: 487 мс.
  • AutoMapper: 28107 мс.

Цифры говорят сами за себя и показывают причину, почему стоит рассмотреть также и EmitMapper.

Несмотря на разницу в подходах, AutoMapper и EmitMapper очень похожи в идеологии. Обе библиотеки выполняют маппинг одного объекта в другой.

Чтобы работать с EmitMapper, установим в проект библиотеку:

Install-Package EmitMapper

Основным объектом, с которым мы будем работать - ObjectMapperManager.

Используем для работы всё те же объекты

public class UserDto
{
  public string FirstName { get; set; }

  public string LastName { get; set; }

  public string Email { get; set; }

}

public class User
{
  public string FullName { get; set; }

  public string Email { get; set; }
}

Настроим конфигурацию:

DefaultMapConfig config = new DefaultMapConfig();
config.ConvertUsing((UserDto source) =>
  new User
  {
      FullName = source.FirstName + " " + source.LastName,
      Email = source.Email
  });

Тогда маппинг можно выполнить так:

var user = ObjectMapperManager
  .DefaultInstance
  .GetMapper<UserDto, User>(config)
  .Map(new UserDto
  {
      FirstName = "Ivan",
      LastName = "Ivanov",
      Email = "[email protected]"
  });

Как видно, синтаксис предельно похож на синтаксис AutoMapper'а.

На практике, лучше всего создать слой абстракции, чтобы не зависеть от конкретной реализации маппера.