Автоматический маппинг объектов в .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 = "ivan@ivanon.ru"
});
Как видно, синтаксис предельно похож на синтаксис AutoMapper’а.
На практике, лучше всего создать слой абстракции, чтобы не зависеть от конкретной реализации маппера.
Добавить комментарий