簡體   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