使用匿名对象替代数据传输对象(DTO)

在多层架构中,数据传输对象(DTO)是一种常见的设计模式,用于在不同层之间传递数据。然而,DTO的大量使用会导致大量的非行为类,这些类的主要作用仅仅是“传递数据”。本文提出了一种替代方案,即使用匿名对象来简化系统设计和架构。

在服务器和客户端分离的场景中,DTO的使用非常普遍。DTO的主要作用是将数据从一个层传递到另一个层,例如从数据库层传递到业务逻辑层,再传递到表示层。然而,随着项目规模的扩大,DTO的数量也会迅速增加,导致代码的复杂度增加。

匿名对象的优势

使用匿名对象替代DTO,可以减少代码的复杂度,提高系统的可维护性。匿名对象是一种轻量级的数据结构,可以在需要时将其映射回原始的领域类,或者使用JSON/反射来获取内部数据。

实现方法

本文介绍了几种使用匿名对象替代DTO的方法,包括:

  • 使用AutoMapper进行对象映射
  • 使用Newtonsoft.Json进行JSON序列化和反序列化
  • 使用LINQ投影生成匿名对象

AutoMapper是一个对象映射库,可以将一个对象的属性映射到另一个对象。使用AutoMapper,可以将匿名对象映射回原始的领域类。

Dim oPerson = Mapper.DynamicMap(Of Person)(AnonymousPerson)

Newtonsoft.Json是一个JSON序列化库,可以将对象转换为JSON字符串,也可以将JSON字符串转换为对象。使用Newtonsoft.Json,可以将匿名对象序列化为JSON字符串,也可以将JSON字符串反序列化为匿名对象。

Function serializeToJSON(anonymous_ As Object) As String Return JsonConvert.SerializeObject(anonymous_, Formatting.Indented) End Function

LINQ是一种强大的查询语言,可以使用LINQ投影生成匿名对象。通过LINQ投影,可以从原始对象中选择需要的属性,生成一个新的匿名对象。

Dim peoplePropertiesSubset = From person In peopleList Select New With {.Name = person.Name, .City = person.City}

代码示例

本文提供了一些代码示例,展示了如何使用匿名对象替代DTO。以下是一些关键的代码片段:

Private Sub testAnonymousObjectMapping() Dim otherProject As New ClassFromOtherProject Dim AnonymousPerson = otherProject.getAnonymous() Dim oPerson = Mapper.DynamicMap(Of Person)(AnonymousPerson) txtMsg.Text = ... End Sub Private Sub testLinqProjection() Dim peopleList = getPeople() Dim peoplePropertiesSubset = From person In peopleList Select New With {.Name = person.Name, .City = person.City} showLinq(peoplePropertiesSubset) End Sub Sub showLinq(linqList As IEnumerable(Of Object)) Dim peopleList = From obj In linqList Select Mapper.DynamicMap(Of Person)(obj) txtMsg.Text = ... End Sub
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485