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