在DDD方法中,我有一個領域模型(DM),具有豐富的行爲。假設我有一個根實體,名爲Order
和相對LineOrder
。 LineOrder
的暴露集合需要爲IReadOnlyCollection
,因爲沒有人可以任意更改集合。代碼:域模型vs Entity FW:在持久模型中進行分裂是否有用時,是否會出現這種情況?
public class Order : AggregateRoot {
// fields
private List<LineOrder> lineOrder;
// ctors
private Order() {
this.lineOrder = new List<LineOrder>();
// other initializations
}
// properties
public IReadOnlyCollection<LineOrder> LineOrder {
get
{
return lineOrder.AsReadOnly();
}
}
// behaviours
}
到目前爲止,這麼好。但是當我想堅持這個域時,我有一些技術上的限制(即使我有一個值對象,一個無參數的構造函數等等),這與一個DDD方法並不完美匹配。 我有另一個限制是:
public class OrderConfiguration : EntityTypeConfiguration<Order>
{
public OrderConfiguration()
{
ToTable("Order");
HasMany<LineOrder>(m => m.LineOrder); // Exception: Cannot convert from IReadOnlyCollection to ICollection
}
}
我不能投IReadOnlyCollection
到ICollection
(順便說一句,如果LineOrder
是一個ICollection
一切OK了!)。
由於我上面表達的原因:在這種情況下可能是有用的創建一個持久性模型(具有所屬缺點:映射DM/PM和反之亦然)?
有沒有其他的選擇?而且,最重要的是:有沒有一種適合DDD方法的替代方案?
對我來說這是一個有點奇怪使用IReadOnlyCollection。正如我記得IReadOnlyCollection不會從內部編輯元素中拯救你。因此,我可以做一些事情,比如readOnlyCollection.First()。Amount = 100.因此,它也不是很好。你不想使用IList而不是IReadOnlyCollection,只需複製lineOrder?從概念上講,還有兩個解決方案:1)返回包括LineOrder項目的列表的完整副本,2)刪除一些訪問者,並使用另一個公共方法與自定義LineOrder表示 – 2014-09-05 20:33:42