C#中不依赖任何映射框架的对象映射实现

作者:微信公众号:【架构师老卢】
9-17 18:16
123

在 C# 中开发应用程序时,通常会遇到需要将域模型(实体)映射到数据传输对象 (DTO) 的情况,反之亦然。DTO 是简化的对象,通常用于跨层传输数据,例如在后端和前端之间传输数据。

处理此映射的一种有效且可重用的方法是使用 Extension Methods。在本文中,我们将探讨如何使用扩展方法进行对象映射,包括单个对象映射和列表对象映射。

为什么使用扩展方法进行对象映射?

扩展方法允许您向现有类添加功能,而无需修改它们。对于对象映射,此方法具有以下几个好处:

  • 干净且可重用的代码: 您可以在一个集中的位置定义映射逻辑,并在整个应用程序中使用它。
  • 可读性: 映射代码变得直观,增强了代码库的可读性。
  • 关注点分离: 映射逻辑与业务逻辑分离,使其更易于维护。

基本概念

在深入研究实现之前,让我们从一个简单的场景开始:

  • Product:表示产品的原始域模型(实体)。
  • ProductDto:DTO 是用于数据传输的产品模型的简化版本。

步骤 1:定义 Model 和 DTO 类

下面是一个简单的类及其相应的 :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

步骤 2:创建对象映射的扩展方法

要将 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

步骤 3:映射对象列表

在实际应用程序中,您通常需要映射对象集合,而不是单个对象。让我们扩展我们的示例来处理产品列表:

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();  
    }  
}

在此代码中:

  • 扩展方法采用对象列表,并使用 LINQ 方法将它们映射到对象列表。ToDtoListProductProductDtoSelect

您现在可以映射如下所示的产品列表:

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();

这种方法使您的代码保持干净和一致,因为映射逻辑封装在扩展方法中。

使用扩展方法进行对象映射的好处

  1. 代码可重用性:您可以在应用程序的不同层或模块中使用相同的映射逻辑。
  2. 可测试性:映射逻辑很容易独立进行单元测试。
  3. 可扩展性:随着项目的增长,您可以轻松地为不同的模型和 DTO 添加更多扩展方法,而不会弄乱您的核心业务逻辑。
  4. 轻量级 :不使用任何映射框架,因为它只涉及简单的任务,没有框架可能依赖的额外计算。

将对象映射到 DTO 是 C# 开发中的一项常见任务。使用扩展方法提供了一种干净、可重用且可维护的方法来处理此问题。只需几行代码,您就可以有效地映射单个对象或集合,使您的代码库井井有条且易于阅读。

本文只是一个开始。您可以扩展此模式以处理更复杂的场景,例如嵌套对象、条件映射,甚至使用 AutoMapper 等库进行自动映射。但是,通过扩展方法了解基础知识是掌握 C# 中对象映射的重要第一步。

相关留言评论
昵称:
邮箱:
阅读排行