在 C# 中开发应用程序时,通常会遇到需要将域模型(实体)映射到数据传输对象 (DTO) 的情况,反之亦然。DTO 是简化的对象,通常用于跨层传输数据,例如在后端和前端之间传输数据。
处理此映射的一种有效且可重用的方法是使用 Extension Methods。在本文中,我们将探讨如何使用扩展方法进行对象映射,包括单个对象映射和列表对象映射。
扩展方法允许您向现有类添加功能,而无需修改它们。对于对象映射,此方法具有以下几个好处:
在深入研究实现之前,让我们从一个简单的场景开始:
下面是一个简单的类及其相应的 :ProductProductDto
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
public class ProductDto
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
在此示例中,DTO () 仅包含与数据传输相关的属性,而忽略了其他属性,如 .ProductDtoCategory
要将 a 映射到 ,我们可以创建一个扩展方法:ProductProductDto
public static class ProductMappingExtensions
{
public static ProductDto ToDto(this Product product)
{
return new ProductDto
{
Id = product.Id,
Name = product.Name,
Price = product.Price
};
}
}
此扩展方法是将对象转换为 .它可以在代码中的任何位置使用,语法如下:ProductProductDto
Product product = new Product { Id = 1, Name = "Laptop", Price = 1000m, Category = "Electronics" };
ProductDto productDto = product.ToDto();
该方法使用新功能增强了类,而无需直接修改它。ToDtoProduct
在实际应用程序中,您通常需要映射对象集合,而不是单个对象。让我们扩展我们的示例来处理产品列表:
public static class ProductMappingExtensions
{
public static ProductDto ToDto(this Product product)
{
return new ProductDto
{
Id = product.Id,
Name = product.Name,
Price = product.Price
};
}
public static List<ProductDto> ToDtoList(this List<Product> products)
{
return products.Select(product => product.ToDto()).ToList();
}
}
在此代码中:
您现在可以映射如下所示的产品列表:
List<Product> products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 1000, Category = "Electronics" },
new Product { Id = 2, Name = "Smartphone", Price = 800, Category = "Electronics" },
new Product { Id = 3, Name = "Tablet", Price = 500, Category = "Electronics" }
};
List<ProductDto> productDtos = products.ToDtoList();
这种方法使您的代码保持干净和一致,因为映射逻辑封装在扩展方法中。
将对象映射到 DTO 是 C# 开发中的一项常见任务。使用扩展方法提供了一种干净、可重用且可维护的方法来处理此问题。只需几行代码,您就可以有效地映射单个对象或集合,使您的代码库井井有条且易于阅读。
本文只是一个开始。您可以扩展此模式以处理更复杂的场景,例如嵌套对象、条件映射,甚至使用 AutoMapper 等库进行自动映射。但是,通过扩展方法了解基础知识是掌握 C# 中对象映射的重要第一步。