繁体   English   中英

.NET Core 2.2中的DDD实体从属性中获取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM