DTO 是否应该位于它工作的 class 内?

Should a DTO be located inside the class it works on?

我还只是一个中等水平的coder。我审查了各种 DTO post,特别是这个 SO Post。我也知道 SO Post 中提到的自动映射器,但我还没有开始将自动映射器集成到我的代码中。但我的问题是关于哪里 DTO 应该位于如果 你正在编码它。 SO Post 中的第三个答案似乎暗示了我在下面显示的内容。

我编写了类似于下面所示的简单 class 结构的代码,将 DTO 合并到 classes 中。 DTO 在域和存储层之间传输数据。自动调用嵌套的 class DTO。也会有互补的 DTO 走另一条路。

Public Class SqlTaskList
    Inherits TaskList
    <Key> Public Overrides Property TaskListID As Integer
    Friend Function SqlToDomainTaskListModel() As TaskList
        Dim theDomainTaskList As New TaskList
        With theDomainTaskList
            .TaskListID = TaskListID
            .TaskListOwner = TaskListOwner
            For Each singleSqlTask In Tasks
                Dim theDomainTaskItem As New TaskItem
                theDomainTaskItem = SqlTaskItem.SqlToDomainTaskItemModel(singleSqlTask)
                theDomainTaskList.Tasks.Add(theDomainTaskItem)
            Next
        End With
        Return theDomainTaskList
    End Function
End Class

Public Class SqlTaskItem
    Inherits TaskItem
    <Key> Public Overrides Property TaskId As Integer
    Shared Function SqlToDomainTaskItemModel(theSqlTaskItem) As TaskItem
        Dim thedomainTaskItem As New TaskItem
        With thedomainTaskItem
            .TaskId = theSqlTaskItem.TaskId
            .TaskName = theSqlTaskItem.TaskName
            .TaskDesc = theSqlTaskItem.TaskDesc
            .TaskOwner = theSqlTaskItem.TaskOwner
        End With
        Return thedomainTaskItem
    End Function
End Class

它工作正常,但我开始怀疑为什么我应该在 class 中包含 DTO。我这样做是因为我在学习如何解决这个问题时已经复习了几次tutorials/examples。

我不太擅长本能地考虑正在使用的内存,但我想到每次实例化上述 classes 时,它们不仅占用数据 space 数据所必需的,他们还加载了 DTO 方法。将 DTO 方法放在 类 之外,这样它们只在需要时实例化会更好吗?由于这可能会添加一些代码,因此似乎可能需要权衡取舍,但我不确定。有没有一种我应该使用的机制,无论 classes 被实例化多少次,它只会加载 DTO 一次?上面的 classes 相对无关紧要,但更大的 classes 似乎会产生更大的影响,是吗?

如果这是一个明显的问题,我深表歉意,但我想帮助理解这里的问题。

在初始 post 之后添加的说明: 我的具体问题是,从内存使用(而非文件)的角度来看,将 DTO 定位在它专门转换的 class 中是否更好,或者 DTO 是否应该在单独的 classes 中?尽管我在上面提到了权衡,但我不认为这是一个意见问题。

我想问的是,当 DTO 在 class 中时,实例化时使用的内存是否显着增加?我不认为这是一种意见——我想询问有关情况的事实。内存占用高还是低?

当 DTO 可作为相同 class 的方法使用时,在代码的其他地方调用 DTO 肯定更方便。但是,如果 DTO 在它们自己的 class 中,那么使用更多内存的成本是否会带来好处?我试图了解在 class 的简单应用程序中运行良好的东西是否会在应用程序扩展时变成活动内存问题。

我很难在脑海中描绘存储层执行过程中发生的事情。上面的 classes 是否只会在存储操作期间实例化,因此不可能同时进行多个实例化,从而得出 DTO 无关紧要的结论?或者在 Web 应用程序的情况下,是否会同时进行大量实例化,这意味着 DTO 可能会被多次实例化,从而不必要地耗尽内存 space?

我担心以直接的方式简单地对存储层进行编码会无意中将自己暴露在下游的内存使用问题中。

首先,根据您上面的代码,您的 DTO 不在同一个 class 中。您有两个单独的 classes,但看起来它们可能在同一个文件中。

是否要将 class 放在不同的文件中或全部放在一个文件中,完全由您决定。我倾向于在一个文件中推荐一个class。这是为了可读性和隔离目的。除了单个代码文件外,它不会改变任何内存占用。这最终会全部编译成一个DLL。因此,在 "new" 之前,classes 确实不会发生任何实例化。我倾向于推荐不同文件夹和命名空间中的单独文件来组织您的代码,以便于导航。随着代码库变大,将所有代码放在一个文件中往往会使其更难阅读。它还将导致 classes 的位置变得毫无意义。它们最终位于一个文件中,但由于组织方式的不同,它们很容易属于另一个文件。

其他帖子中的示例将它们显示在一个地方通常只是为了说明目的,以便于在像 SO 这样的平台上阅读。很难从一堆单独的文件中放置代码并在此处以有意义的方式显示它们。

就仅加载 class 的单个实例而言,您基本上是在谈论单例模式。您可以使用大量资源进行查找。