2010-10-06 66 views
0

使用Northwind模式作爲您在以下情況下使用集合接口的示例。哪個.Net集合接口在域模型中使用?

Northwind Schema http://northwind.techmatica.com/images/NorthwindLayout.JPG

客戶

客戶有訂單的集合。就本例而言,Orders集合是隻讀的。

訂購

定單已經訂單明細的集合。 OrderDetail可以添加到集合中。

員工

僱員擁有領土的集合。員工可以屬於0個或更多地區,但TerritoryId必須是唯一的。

+0

不明確的問題。爲什麼Orders集合是隻讀的? – 2010-10-06 22:54:27

+0

@AlexLo。編輯問題以規定Orders集合對於此示例是隻讀的。 – 2010-10-06 23:01:45

回答

2

在所有三種情況下使用ICollection<T> 訂單和OrderDetails。對於只讀集合沒有特定的接口,這是由實現處理的(在這種情況下,您可以使用ReadOnlyCollection<T>作爲具體類型)。你也可以使用IList<T>,但它只增加了索引訪問的支持,這在關係模型中通常沒有意義。

對於地區,您可以使用ISet<T>(假設您使用的是.NET 4.0)。實現此接口的類不允許重複的項目。

+0

最安全的只讀集合是IEnumerable ,因爲ICollection支持Add() – 2010-10-06 23:09:58

+0

是的,我猜IEnumerable 也可以。但它並不能真正阻止對集合的修改:如果實際集合是ICollection ,則仍然可以投射到ICollection ,然後調用Add ... – 2010-10-06 23:20:38

+0

ICollection 接口不會規定項目必須是唯一的。因此它是否違反了Customer.Territories的要求? – 2010-10-06 23:22:46

1

需要更多信息。例如,爲什麼Orders集合是隻讀的?這些集合是如何使用的?這裏有很多變數。

關鍵是,將它們暴露爲最簡單的界面,以滿足您的需求。如果您始終只是遍歷整個列表並且從不添加它,請不要使用ICollection<T>。另一方面,如果您發現自己希望投射到IList<T>以按索引添加或獲取項目,請不要使用IEnumerable<T>

例如,如果您是通過MVVM爲演示文稿創建模型,那麼我可能會建議您使用BindingList。如果您只對訂單進行彙總操作,我可能會建議一個簡單的IEnumerable<T>。等