[英]DDD entities in .NET Core 2.2 Get from properties
在这个问题的上下文中,如果我使用Entity这个词我指的是DDD实体,除非我明确声明我在谈论EF核心实体
我一直在阅读Microsoft关于.NET Core的DDD模式的文档 。
我也一直在查看他们创建的GitHub仓库 ,其中包含上述文档中描述的实现。 具体来说,我正在查看Order.cs
聚合(链接指向的位置)。
问题的背景
我试图了解他们如何实现Enumeration
属性。
正如您所看到的, Enumeration
类型类似于Value Object,但它是一种更方便的建模属性(imho),其行为类似于枚举。
使用Enumeration
类型的DDD实体的摘录(完整实体位于上面的repo链接中):
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;
}
}
有没有更清洁的方法来实现这一点?
如果是值类型,为什么不将其视为值类型(在EF核心术语所有实体中 )?
拥有的类型基本上是没有标识的类型(它们不是由ID标识,而是由它的整个值标识)。 在引擎盖下,拥有类型的每个属性将被转换为拥有实体的列名。
这是将值类型映射到关系数据库的绝佳方法,您不必向模型添加标识(id)列。 常见的例子是订单上的Address
。
如果这不能满足您的需求,可以使用Value Converter将类型转换为数据库理解的类型(即enum - > string而不是enum id)。 这可以用于将id(或字符串)转换为正确的值类型并分配它。
通常,您的问题来自于将持久性知识泄漏到您的域中, __orderStatusId
与关系存储相关,并且在您的域中绝对没有任何意义。 这是你绝对要避免在设计DDD模型时的东西。
DDD模型永远不应受持久性技术的影响(即,具有数据库或ORM映射器所需的构造函数,在值类型上具有ID,因为它们“映射”到数据库表,等等)。
使用转换器,您可以将值类型转换为id和id转换为value类型,其中包含的内容
var converter = new ValueConverter<OrderStatus, int>(
v => v.Id,
v => Enumeration.FromValue<OrderStatus>(v));
modelBuilder
.Entity<Order>()
.Property(e => e.OrderStatus)
.HasConversion(converter);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.