C#中通过Mapster实现轻量级高效对象映射器

科技   2024-11-26 06:38   上海  


当谈到 C# 中的对象关系映射时,许多人会立即想到 AutoMapper。事实上,AutoMapper 是一个出色的对象映射库。

但是,今天我想分享另一个我个人认为更轻量级、更有用的库:Mapster。虽然它的受欢迎程度可能不如 AutoMapper 高,但它的力量是不可否认的。

使用步骤

安装所需的 NuGet 包:

<PackageReference Include="Mapster" Version="7.4.0" />

创建实体类:

定义一个简单的实体类 ,如下所示:Person

public class Person  
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}

创建 DTO 类:

定义用于数据传输的 DTO 类,如下所示:PersonDto

public class PersonDto  
{
public int Id { get; set; }
public string FullName { get; set; }
public int Age { get; set; }
public DateTime CreatedAt { get; set; }
}

编写 CalculateAge 方法:

为了计算年龄,您需要一种辅助方法。此步骤不是必需的:

/// <summary>
/// Calculate age based on date of birth.
/// </summary>
/// <param name="dateOfBirth"></param>
/// <returns></returns>
public static int CalculateAge(DateTime dateOfBirth)
{
return (DateTime.Today.Year - dateOfBirth.Year) - ((DateTime.Today.Month < dateOfBirth.Month) ? 1 : 0);
}

使用 Mapster:

在 中,使用 Mapster 的 static 方法执行对象映射:Program.csAdapt

// Configure Mapster mapping rules.
// By default, Mapster will match based on the same field names of the two entities.
// So if there are two classes with the same field names, Mapster will automatically map the property values of one class to the corresponding properties of the other.
// When more complex object mapping is needed, you need to configure it through `TypeAdapterConfig`.
// For example, you can define custom mapping rules, specifying how to map from the source object to the target object. This allows you to flexibly control the details of the mapping process.
TypeAdapterConfig<Person, PersonDto>
.NewConfig()
.Map(dest => dest.FullName, src => $"{src.FirstName}{src.LastName}")
.Map(dest => dest.Age, src => CalculateAge(src.DateOfBirth))
.AfterMapping((src, dest) =>
{
// Custom logic, such as adding additional information.
dest.CreatedAt = DateTime.Now;
});

// Create a Person entity object.
var person = new Person {
Id = 1,
FirstName = "Jacky",
LastName = "Yang",
DateOfBirth = new DateTime(1990, 1, 1)
};

// Use Mapster to map the person object to the PersonDto type.
var personDto = person.Adapt<PersonDto>();

// Output the mapping result.
Console.WriteLine($"Full Name:{personDto.FullName}");
Console.WriteLine($"Age:{personDto.Age}");
Console.WriteLine($"Created At:{personDto.CreatedAt}");
Console.ReadKey();

运行程序

编译并运行程序,您将看到对象已成功转换为对象,并且包括 custom 和 fields。PersonPersonDtoFullNameAge

比较 Mapster 和 AutoMapper

Mapster 和 AutoMapper 都非常适合在 DTO(数据传输对象)和实体之间进行映射,从而简化代码并提高开发效率。但是,Mapster 具有以下优点:

  • Mapster 在速度和内存使用方面表现更好。 根据早期版本 6.0 的官方性能对比表,Mapster 在处理速度和内存消耗方面都优于 AutoMapper。这是因为 Mapster 使用预编译策略,允许 Mapster 在编译时生成映射代码,从而避免了运行时反射的开销。这使其在处理大型数据集时具有性能优势。因此,Mapster 是需要高性能和低内存消耗的应用程序的更好选择。

  • 更易于使用。 Mapster 使用更简单,您只需一行代码即可执行对象映射:

var personDto = person.Adapt<PersonDto>();

这种简单性使 Mapster 在实际开发中非常方便。

  • 与 Entity Framework 和 LINQ 集成。 Mapster 提供与 Entity Framework 和 LINQ 的无缝集成,使其在处理数据访问层时更加强大。

Mapster 注意事项和建议

使用 Mapster 时,请考虑以下建议:

  • 适度使用: Mapster 功能强大,但并非每个场景都是必需的。在某些情况下,手动映射可能更清晰、更高效。

  • 保持简单: 对于简单的映射,不要使事情过于复杂。您可以使用默认映射。

  • 模块化配置: 为不同的模块创建单独的映射配置,以保持代码整洁。

  • 配置映射规则: 虽然 Mapster 支持自动映射,但手动配置映射规则可以提高复杂场景中的灵活性和可维护性。

  • 性能监控: 在实际业务应用程序中处理大量数据时,请注意性能问题。如有必要,请进行优化。

怎么样?您不认为 Mapster 比 AutoMapper 更方便、更用户友好吗?是真的!

虽然 AutoMapper 提供的功能比 Mapster 更多,但在合适的场景中,Mapster 更轻、更高效、更容易学习。

如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章