В контексте этого вопроса, если я использую слово Сущность Я имею в виду сущность DDD, если только я явно не заявляю, что говорю об основной сущности EF
Я читал документацию Microsoft по шаблонам DDD для .NET Core.
Я также смотрел на репозиторий GitHub , который они создали, который содержит реализацию, описанную в вышеупомянутой документации. В частности, я смотрю на совокупность Order.cs
(на которую указывает ссылка).
Предыстория проблемы
Я пытаюсь понять, как они реализовали Enumeration
свойств.
Как вы можете видеть, тип Enumeration
похож на объект Value, но является более удобным способом (imho) моделирования атрибутов, которые ведут себя как перечисления.
Выдержка из сущности DDD, которая использует тип Enumeration
(полная сущность находится в ссылке на репо выше):
public class Order
: Entity, IAggregateRoot
{
public OrderStatus OrderStatus { get; private set; }
private int _orderStatusId;
public Order()
{
_orderStatusId = OrderStatus.Submitted.Id;
}
}
Проблема
Реализация свойства таким способом означает, что всякий раз, когда вы get
свойство OrderStatus
, это null
.
Я понимаю, что инкапсуляция сущности в DDD имеет первостепенное значение, но, безусловно, это касается только изменения вашего состояния. Реализация метода GetOrderStatus
кажется очень хакерским способом простого чтения значения свойства:
public class Order
: Entity, IAggregateRoot
{
public OrderStatus OrderStatus { get; private set; }
private int _orderStatusId;
public Order()
{
_orderStatusId = OrderStatus.Submitted.Id;
}
public OrderStatus GetOrderStatus()
{
return Enumeration.FromValue<OrderStatus>(_orderStatusId);
}
}
Единственное, о чем я подумал, это реализация свойства, подобного приведенному ниже, но это нарушает EF Core:
public class Order
: Entity, IAggregateRoot
{
public OrderStatus OrderStatus
{
get
{
return Enumeration.FromValue<OrderStatus>(_orderStatusId);
}
private set
{
Status = value;
}
}
private int _orderStatusId;
public Order()
{
_orderStatusId = OrderStatus.Submitted.Id;
}
}
Есть ли более чистый способ реализовать это?