在多层架构中,数据传输对象(DTO)是一种常见的设计模式,用于在不同层之间传递数据。然而,DTO的大量使用会导致大量的非行为类,这些类的主要作用仅仅是“传递数据”。本文提出了一种替代方案,即使用匿名对象来简化系统设计和架构。
在服务器和客户端分离的场景中,DTO的使用非常普遍。DTO的主要作用是将数据从一个层传递到另一个层,例如从数据库层传递到业务逻辑层,再传递到表示层。然而,随着项目规模的扩大,DTO的数量也会迅速增加,导致代码的复杂度增加。
使用匿名对象替代DTO,可以减少代码的复杂度,提高系统的可维护性。匿名对象是一种轻量级的数据结构,可以在需要时将其映射回原始的领域类,或者使用JSON/反射来获取内部数据。
本文介绍了几种使用匿名对象替代DTO的方法,包括:
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