【问题标题】:Data Access Layer: Exposing List<>: bad idea?数据访问层:公开列表<>:坏主意?
【发布时间】:2010-09-17 03:19:02
【问题描述】:

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

我将在内部将 Data 实现为 List,但我记得读过一些关于在不需要时不将 List 类型公开给消费者的内容。

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

你知道为什么(谷歌没有帮助)吗?你通常会为那种东西暴露什么?列表? IEnumerable?

【问题讨论】:

    标签: architecture list ienumerable data-access-layer ilist


    【解决方案1】:

    通常最好公开用户仍然可以有意义地使用的最不强大的界面。如果用户只需要一些可枚举的数据,返回IEnumerable&lt;User&gt;。如果这还不够,因为用户需要能够修改列表(注意!不应该经常出现这种情况),请返回 IList&lt;User&gt;

    /编辑:

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

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

    更重要的是,这通过返回类型公开了部分内部实现。如果将来我需要更改实现以使其不再使用IList 容器,我有一个问题:我要么需要更改方法合同,要么引入构建中断更改。或者我需要将数据复制到列表容器中。

    例如,假设一个高效的实现使用 Dictionary 并且只返回未实现 IListValues 集合。

    【讨论】:

    • 我还没有接受“最不强大”的想法;如何让每个代码块尽可能有用?
    • 另外,当你想在被调用方控制它时,你可以选择返回 ReadOnlyCollection
    【解决方案2】:

    绝对是 ISomething。使用接口将减少耦合,并使更改数据层实现的细节变得更容易。哪个接口视情况而定。 IList 很好,但有时您可能需要 ICollection 功能或希望指定只读值。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 好点。为了完整起见,也许您可​​以添加一个示例来说明这种情况。
      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2011-03-31
      • 2012-06-18
      • 2023-03-10
      • 2019-05-06
      • 2013-02-28
      相关资源
      最近更新 更多