在 class 设计中嵌套 class 总是更好吗?

In class design are nested classes always better?

以下项目将在 Microsoft SQL 服务器数据库中维护并首先使用 EF 代码开发:

定义嵌套的 classes 总是更好吗,意思如下(简化定义以保持简单),让数据库完成维护关系的工作:

Public Class Assembly
    Public Property assemblyID As Integer
    Public Property parts As New List(Of Part)
End Class

Public Class Part
    Public Property partID As Integer
    Public Property subitems As New List(Of Subitem)
End Class

Public Class Subitem
    Public Property subitemID As Integer
    Public Property components As New List(Of Component)
End Class

Public Class Component
    Public Property componentID As Integer
    Public Property elements As New List(Of Element)
End Class

Public Class Element
    Public Property elementID As Integer
    Public Property Name As New List(Of String)
End Class

或者是否有任何理由将 class 分开并手动维护每个 class 中记录之间的关系,含义如下:

Public Class Assembly
    Public Property assemblyID As Integer
    Public Property parts As New List(Of Integer) 'which would be partIDs
End Class

Public Class Part
    Public Property partID As Integer
    Public Property subitems As New List(Of Integer) 'which would be subitemIDs
End Class

Public Class Subitem
    Public Property subitemID As Integer
    Public Property components As New List(Of Integer) 'which would be componentIDs
End Class

Public Class Component
    Public Property componentID As Integer
    Public Property elements As New List(Of Integer) 'which would be elementIDs
End Class

Public Class Element
    Public Property elementID As Integer
    Public Property Name As New List(Of String)
End Class

我一直认为我们应该设计 class 嵌套的 es 以遵循实际数据的结构。但由于这是一个更深的嵌套,我想我会问是否有其他我应该考虑的设计方法。

在这种特殊情况下,所有记录都是唯一的。 IE。尽管我让它看起来像是一个组装好的部件,但我只是想清楚地命名每个级别。但在这种情况下,这些层项目中的任何一个都不会在不同的程序集中使用。

如果您所有的结构都具有相同的深度,那么您的模型可能是最好的。否则考虑层次结构。像这样。

Public Class PartModel
   Public Property Id as Integer
   Public Property Name As String
   Public Property ParentId As Integer? ''Nullable(Of Integer)
   <ForeignKey("ParentId")>
   Public Property SubParts As List(Of PartModel) ''Note no **New** here. New will be in a Controller
End Class