2010-10-06 36 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>。等

相关问题