Как сопоставить совокупные корни в DDD без ORM?

#vb.net #mapping #domain-driven-design

#vb.net #сопоставление #дизайн, управляемый доменом

Вопрос:

У меня есть агрегаты с защищенными свойствами, и его общедоступный конструктор гарантирует, что он собран в согласованном состоянии и где проверяются бизнес-правила. Для создания агрегата его используют службы приложений. Моей первой идеей было создать защищенный конструктор со всеми параметрами, необходимыми для получения сохраняемого агрегата, и на уровне инфраструктуры создать дочерние агрегаты для сопоставления объектов инфраструктуры (которые сопоставляются с таблицами БД) с этими дочерними агрегатами.

Проблема в том, что мне бы не хотелось, чтобы с прикладного уровня агрегированные корни могли быть построены каким-либо другим способом, кроме как с его основными конструкторами. И я не хочу создавать совокупные корни с основными конструкторами из инфраструктуры, чтобы бизнес-правила или события домена не применялись. Является ли это хорошей практикой в данном конкретном случае?

Совокупный корень:

 Public Class Order

     Protected Property ID As OrderID
     Protected Property CreatedOn As Date

     Public Sub New(ID As OrderID)

         Me.ID = ID
         Me.CreatedOn = Now

     End Sub

     Protected Sub New(ID As OrderID, createdOn As Date)
     
          Me.ID = ID
          Me.CreatedOn = createdOn
  
     End Sub

End Class
 

Дочерний совокупный корень в инфраструктуре:

 Friend Class OrderPersisted
    Inherits Order

    Public Sub New(ID As OrderID, createdOn As Date)

        MyBase.New(ID, createdOn)

    End Sub

End Class
 

Инфраструктурная сущность:

 Friend Class OrderEntity

    Public Property ID As Guid
    Public Property CreatedOn As Date

    Public Function ToDomainModel(orderEntity As OrderEntity) As Order

        Return New OrderPersisted(New OrderID(orderEntity.ID), orderEntity.CreatedOn)

    End Function

End Class
 

PS: О модификаторе Friend в VB.Net : «Указывает, что один или несколько объявленных программных элементов доступны только из сборки, содержащей их объявление».