#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 : «Указывает, что один или несколько объявленных программных элементов доступны только из сборки, содержащей их объявление».