我目前正在编写一个简单的数据访问层,我想知道我应该向其他层公开哪种类型。

我将在内部实现数据作为列表<>,但我记得在不需要的情况下阅读有关不向消费者公开List类型的内容。

public List<User> GetAllUsers() // non C# users: that means List of User :)

你知道为什么(谷歌没有帮助)?你经常为那种东西揭露什么? IList的? IEnumerable的?

有帮助吗?

解决方案

通常最好暴露用户仍可以有意义地使用的功能最少的界面。如果用户只需要一些可枚举的数据,请返回 IEnumerable&lt; User&gt; 。如果这还不够,因为用户需要能够修改列表(注意!通常不应该这样),请返回 IList&lt; User&gt;

/编辑:

Joel在评论中提出了一个有效的问题:为什么确实暴露了功能最少的界面而不是授予用户最大权力? (转述)

这背后的想法是返回数据的方法可能不希望用户修改其内容:该类的另一个方法可能仍然期望在返回对它的引用之后该列表为非空。想象一下,用户从列表中删除所有数据。另一种方法现在必须另外检查ele可能是不必要的。

更重要的是,这通过返回类型公开了部分内部实现。如果我将来需要更改实现以便它不再使用 IList 容器,我就会遇到一个问题:我要么需要更改方法契约,要么引入一个破坏性的更改。或者我需要将数据复制到列表容器中。

作为一个例子,假设一个有效的实现使用Dictionary并且只返回 Values 集合,该集合没有实现 IList

其他提示

绝对是一个ISomething。使用界面将减少耦合,并使您更容易更改数据层实施的详细信息。哪个界面取决于具体情况。 IList很好,但有时您可能需要ICollection功能或者想要指定ReadOnly的值。

在返回IEnumerable之前,您应该仔细考虑。如果底层代码使用“yield”,那么要生成IEnumerable,或正在使用LINQ,那么你最终会保持打开所有使用的资源。

在返回之前,您应该将IEnumerable复制到另一个IEnumerable中。通过使用IList,您可以将其作为一项要求,这样任何人都无法无意中返回IEnumerable。

另一方面,返回IList意味着调用者可以更改返回的列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top