在 .NET 开发中,处理对象间的映射通常是一项重复且容易出错的任务。为了简化这一过程,开发者常常使用诸如 AutoMapper 这样的库,而 Mapster 是另一个轻量级且高效的替代方案。Mapster 提供了强大的功能、简洁的配置和优秀的性能,尤其适合对性能要求较高的场景。本文将详细介绍 Mapster 的使用方法,包括基础用法、高级特性以及性能优化,帮助你充分利用这一工具。
首先,我们需要将 Mapster 集成到项目中。你可以通过 NuGet 包管理器或 .NET CLI 来安装 Mapster。
NuGet 安装:
Install-Package Mapster
.NET CLI 安装:
dotnet add package Mapster
安装完成后,你就可以开始使用 Mapster 进行对象映射了。
Mapster 的核心功能就是提供快速的对象映射。你只需通过 TypeAdapter
类来映射源对象和目标对象,操作简便且高效。
假设有两个简单的类:
public class SourceClass
{
public int Id { get; set; }
public string Name { get; set; }
}
public class DestinationClass
{
public int Id { get; set; }
public string Name { get; set; }
}
使用 Adapt
方法,Mapster 可以轻松将 SourceClass
类型的对象映射为 DestinationClass
类型:
var source = new SourceClass { Id = 1, Name = "John" };
var destination = source.Adapt();
Console.WriteLine($"Id: {destination.Id}, Name: {destination.Name}");
// 输出: Id: 1, Name: John
这种映射方式非常直观,Mapster 会自动匹配源对象和目标对象之间的属性。
Mapster 还支持映射集合类型,可以非常方便地将一个集合从源类型映射到目标类型。这对于批量转换数据非常有用。
var sourceList = new List
{
new SourceClass { Id = 1, Name = "John" },
new SourceClass { Id = 2, Name = "Jane" }
};
var destinationList = sourceList.Adapt>();
foreach (var item in destinationList)
{
Console.WriteLine($"Id: {item.Id}, Name: {item.Name}");
}
// 输出:
// Id: 1, Name: John
// Id: 2, Name: Jane
在这个例子中,Mapster 会自动将 sourceList
中的每一个 SourceClass
对象映射为一个 DestinationClass
对象,并返回一个新的列表。
在实际项目中,你可能需要根据不同的需求自定义映射规则。Mapster 允许你为特定的属性配置自定义映射规则,极大地提高了灵活性。
假设你需要将 SourceClass
的 Name
属性转换为大写,并映射到目标类的 FullName
属性:
TypeAdapterConfig
.NewConfig()
.Map(dest => dest.Name, src => src.Name.ToUpper());
var source = new SourceClass { Id = 1, Name = "John" };
var destination = source.Adapt();
Console.WriteLine($"Name: {destination.Name}");
// 输出: Name: JOHN
在这个例子中,我们使用 Map
方法手动指定了源属性如何映射到目标属性,并通过自定义转换将源对象的 Name
转换为大写。
除了创建一个新的目标对象,Mapster 还支持将映射结果应用到一个已经存在的对象。这对于减少内存分配非常有用,尤其是在处理大数据时。
var source = new SourceClass { Id = 1, Name = "John" };
var destination = new DestinationClass { Id = 10, Name = "Default" };
source.Adapt(destination);
Console.WriteLine($"Id: {destination.Id}, Name: {destination.Name}");
// 输出: Id: 1, Name: John
通过 Adapt(destination)
方法,Mapster 将源对象的数据映射到已存在的目标对象 destination
中,而不需要创建新的对象。
在处理复杂对象时,Mapster 也能够自动处理嵌套对象的映射。你只需确保目标类中也有相应的嵌套对象,Mapster 会递归地进行映射。
public class SourceClass
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class DestinationClass
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
var source = new SourceClass
{
Id = 1,
Name = "John",
Address = new Address { Street = "123 Main St", City = "New York" }
};
var destination = source.Adapt();
Console.WriteLine($"Name: {destination.Name}, Street: {destination.Address.Street}");
// 输出: Name: John, Street: 123 Main St
这里,Address
是一个嵌套对象,Mapster 会自动处理嵌套属性的映射。
有时,我们希望根据某些条件来决定是否进行映射,Mapster 支持条件映射。你可以指定某个属性在满足特定条件时才会被映射。
TypeAdapterConfig
.NewConfig()
.Map(dest => dest.Name, src => src.Name != "John" ? src.Name : "Default Name");
var source = new SourceClass { Id = 1, Name = "John" };
var destination = source.Adapt();
Console.WriteLine($"Name: {destination.Name}");
// 输出: Name: Default Name
在这个例子中,只有当 Name
不是 "John"
时,Name
属性才会被映射。如果 Name
为 "John"
,则目标对象的 Name
会被设置为 "Default Name"
。
Mapster 支持枚举类型的映射,并允许你为枚举值提供自定义的映射规则。
public enum Status
{
Pending,
Approved,
Rejected
}
public class SourceClass
{
public Status Status { get; set; }
}
public class DestinationClass
{
public string Status { get; set; }
}
TypeAdapterConfig
.NewConfig()
.Map(dest => dest.Status, src => src.Status.ToString());
var source = new SourceClass { Status = Status.Approved };
var destination = source.Adapt();
Console.WriteLine($"Status: {destination.Status}");
// 输出: Status: Approved
在此示例中,我们将枚举值 Status
转换为字符串并映射到目标对象的 Status
字符串属性。
对于性能要求较高的场景,Mapster 提供了编译配置功能。通过 Compile()
方法,Mapster 可以生成高效的映射代码,避免在运行时使用反射,从而提升性能。
TypeAdapterConfig.GlobalSettings.Compile();
调用 Compile()
方法后,Mapster 会在编译时生成映射代码,显著提高映射性能。
当需要进行更复杂的多级映射时,Mapster 也能轻松应对。你可以指定深层次的属性映射。
public class SourceClass
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
public class DestinationClass
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
var source = new SourceClass
{
Id = 1,
Name = "John",
Address = new Address { Street = "123 Main St", City = "New York" }
};
TypeAdapterConfig
.NewConfig()
.Map(dest => dest.Address, src => $"{src.Address.Street}, {src.Address.City}");
var destination = source.Adapt();
Console.WriteLine($"Name: {destination.Name}, Address: {destination.Address}");
// 输出: Name: John, Address: 123 Main St, New York
在这个例子中,Address
属性通过字符串拼接映射到目标类的 Address
字符串属性。
Mapster 是一个高效、灵活且功能强大的对象映射工具,能够简化对象转换过程。它具备以下优点:
掌握 Mapster 的使用,可以显著提升开发效率,简化对象映射的复杂性,特别适用于对性能要求较高的项目。希望本文能够帮助你更好地理解和使用 Mapster,提升你的开发体验。