【发布时间】:2009-11-25 16:15:51
【问题描述】:
我想知道在类中公开集合的推荐方法是什么,以及它与使用 NHibernate 实体时做同样事情的方式是否有任何不同。
让我解释一下...我的类公开集合属性从未遇到过具体问题,例如:
IList<SomeObjType> MyProperty { get; set; }
将 setter 设置为 protected 或 private 有时可以让我更好地控制我想要如何处理集合。 我最近看到了 Davy Brion 的这篇文章:
http://davybrion.com/blog/2009/10/stop-exposing-collections-already/
Davy 明确建议将集合作为 IEnumerables 而不是让我们说 Lists,以禁止用户选择直接操作这些集合的内容。我可以理解他的观点,但我并不完全相信,通过阅读他帖子中的 cmets,我并不是唯一一个。
但是,当涉及到 NHibernate 实体时,以他建议的方式隐藏集合非常有意义,尤其是在级联到位时。我想完全控制会话中的实体及其集合,并且为集合属性公开 AddXxx 和 RemoveXxx 对我来说更有意义。
问题是怎么做呢?
如果我将实体的集合作为 IEnumerables 我无法添加/删除元素到它们而不通过执行 ToList() 将它们转换为列表,这会创建一个新列表,因此无法保留任何内容,或者将它们转换为列表由于代理和延迟加载,这很痛苦。
总体思路是不允许检索实体并直接操作其集合(add.remove 元素),而只能通过我公开的方法,同时尊重集合持久性的级联。
我们将不胜感激您的建议和想法。
【问题讨论】:
标签: c# nhibernate oop collections