2014-09-04 23 views
0

在DDD方法中,我有一個領域模型(DM),具有豐富的行爲。假設我有一個根實體,名爲Order和相對LineOrderLineOrder的暴露集合需要爲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 
    } 
} 

我不能投IReadOnlyCollectionICollection(順便說一句,如果LineOrder是一個ICollection一切OK了!)。

由於我上面表達的原因:在這種情況下可能是有用的創建一個持久性模型(具有所屬缺點:映射DM/PM和反之亦然)?

有沒有其他的選擇?而且,最重要的是:有沒有一種適合DDD方法的替代方案?

+0

對我來說這是一個有點奇怪使用IReadOnlyCollection。正如我記得IReadOnlyCollection不會從內部編輯元素中拯救你。因此,我可以做一些事情,比如readOnlyCollection.First()。Amount = 100.因此,它也不是很好。你不想使用IList而不是IReadOnlyCollection,只需複製lineOrder?從概念上講,還有兩個解決方案:1)返回包括LineOrder項目的列表的完整副本,2)刪除一些訪問者,並使用另一個公共方法與自定義LineOrder表示 – 2014-09-05 20:33:42

回答

1

您是否試過將LineOrder集合聲明爲protected?這種方式EF可以訪問,但消費者沒有。

// properties 
protected ICollection<LineOrder> LineOrder { get; set; } 

然後,您可以在一個只讀的方式公開此集合,最終用戶有:

public IReadOnlyCollection<LineOrder> ReadOnlyLineOrder 
{ 
    get 
    { 
     return LineOrder.ToList().AsReadOnly(); 
    } 
} 
+2

IMO這是一個評論,而不是一個答案。 – 2014-09-04 12:36:19

+0

是的,它有效,但有幾個副作用: i)我不想隱藏'LineOrder'給消費者,而是我想隱藏'lineOrder' ii)使用'ICollection'而不是'IReadOnlyCollection'如果調用「Add」會導致運行時錯誤(其中'IReadOnlyCollection'將產生編譯時錯誤,而且更好) – 2014-09-04 12:52:43

+0

道歉因爲沒有更完整。我將編輯答案以提高清晰度。 – 2014-09-04 13:06:59

相關問題