【问题标题】:Should a DTO be located inside the class it works on?DTO 是否应该位于它所处理的类中?
【发布时间】:2018-07-30 03:43:41
【问题描述】:

我仍然只是一个中等水平的程序员。我查看了各种 DTO 帖子,尤其是 SO Post。我也知道 SO Post 中提到的自动映射器,但我还没有开始将自动映射器集成到我的代码中。但我的问题是关于 哪里 DTO 应该位于 如果 您正在编写它。 SO Post 的第三个答案似乎暗示了我在下面显示的内容。

我编写了如下所示的简单类结构,将 DTO 合并到类中。 DTO 在域和存储层之间传输数据。自动调用嵌套类 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

它工作得很好,但我开始想知道为什么我应该在课堂上设置 DTO。我之所以这样做,是因为我在学习如何解决此问题时查看过的几个教程/示例中已经看到这样做了。

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

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

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

我在问当 DTO 在类内时,实例化时使用的内存是否明显更高?我不认为这是一种观点——我试图询问情况的事实。内存使用率高不高?

当 DTO 可用作同一类的方法时,在代码的其他地方调用 DTO 肯定更方便。但是,如果 DTO 属于自己的类别,那么这种好处是否会伴随着消耗更多内存的成本呢?我试图了解在该类的简单应用程序中运行良好的内容是否会在应用程序扩展时变成活动内存问题。

我很难想象在使用存储层执行期间发生了什么。上面的类是否只会在存储操作期间被实例化,所以不可能同时有多个实例化,从而得出 DTO 无关紧要的结论?或者在 Web 应用程序的情况下,是否有大量的同时实例化,这意味着 DTO 可能会被实例化多次,从而不必要地占用内存空间?

我担心,在以简单的方式简单地对存储层进行编码时,我会在不知不觉中让自己面临下游的内存使用问题。

【问题讨论】:

  • 使用嵌套类与顶级类完全不应该影响内存使用。

标签: vb.net dto


【解决方案1】:

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

您可以自行决定是否要将您的课程放在不同的文件中或全部放在一个文件中。我倾向于在一个文件中推荐一门课程。这是出于可读性和隔离目的。除了单个代码文件之外,它不会更改任何内存占用。这最终将全部编译成 DLL。因此,在您“新建”它之前,实际上不会发生任何类的实例化。我倾向于推荐不同文件夹和命名空间中的单独文件来组织您的代码,以便于导航。随着代码库变得越来越大,将所有代码放在一个文件中往往会使阅读变得更加困难。这也将导致类的潜力在它们所在的地方没有意义。它们最终都在这个文件中,但由于事物的组织方式,它们很容易属于另一个文件。

其他帖子中在一个地方展示它们的示例通常仅用于说明目的,以便在 SO 之类的平台上轻松阅读。很难从一堆单独的文件中放入代码并在此处以有意义的方式显示它们。

就只加载一个类的单个实例而言,您基本上是在谈论单例模式。有很多资源可以用来查找。

【讨论】:

  • 感谢您的回复。我试图在上面澄清以专注于实例化。我认为您的观点是 DTO 不在同一类含义中并置;我的意思是,目前每个 DTO 都在它转移的类中。您的 Singleton 评论帮助了我,但我不知道是否应该或如何将它应用到存储层中。
  • 根据您提供的代码,我很难理解您的问题。所有类最终都从另一个类中实例化。我不明白它是 DTO 的事实有什么不同。我不知道你是如何把它移到课堂之外的。这就是我的困惑所在。我认为内存使用不会有任何差异。您可以随时下载探查器工具来查看差异(甚至只使用 Visual Studio)来查看此信息。
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多