【问题标题】:Should there be entity-specific methods in the repositories?存储库中是否应该有特定于实体的方法?
【发布时间】:2019-11-13 10:07:26
【问题描述】:

我一直在阅读有关存储库模式以及如何正确实现它的信息。

我对一个重要问题感到困惑。

假设我们有一个通用存储库,其中包含 Add()、Remove()、GetById() 等基本操作,并且每个实体也有一个特定存储库(例如 ProductRepository、UserRepository 等)

我们是否应该在特定的存储库中定义实体相关的操作?例如,在 ProductRepository 中,我应该声明 GetProductsInCategory()、GetProductsByBrandId() 等方法还是服务层的责任?

那里有很多相互矛盾的信息,例如,this answer 声称我刚刚提出的问题的答案是,但另一方面在this tutorial video(有很多观点)中,讲师声称我的问题的答案是

我真的对我们必须在存储库中实现的实际方法和操作感到困惑。

【问题讨论】:

  • 这听起来像是主要基于意见的东西。 C# 本身没有关于此的内容。我个人会坚持使用泛型 Add 等,因为类名和函数参数以及返回类型应该使类型足够清晰
  • @fredrik 如果你这样想的话,一半的计算机科学和软件工程是基于意见的!但是在这个问题的情况下,我不认为它是基于意见的,我认为(我提到的)一个小组可能是错误的并且忽略了关于存储库模式的关键点,我看到两个小组都对自己的意见很确定,而且他们似乎有证据证明他们所说的是正确的。
  • @AmirHosseinAhmadi aaaannnnnddd...您刚刚描述了基于意见。

标签: c# design-patterns repository-pattern


【解决方案1】:

假设我们有一个通用存储库,其中包含 Add()、Remove()、GetById() 等基本操作

如果这些成员没有暴露在数据访问层之外,这是可以的。基本上,avoid generic repository。但是,由于这不是您问题的核心,所以我不会在这里详细说明。

我们还为每个实体提供了一个特定的存储库(例如 ProductRepository、UserRepository 等)

这是一个很好的做法。

我们是否应该在特定的存储库中定义实体相关的操作?例如,在 ProductRepository 中,我应该声明 GetProductsInCategory()、GetProductsByBrandId() 等方法吗?

这些函数必须是特定存储库的一部分。其实这就是特定仓库存在的目的。

或者这是服务层的责任?

这是基于意见的。
是的;您删除完整的存储库层并在服务中执行所有这些操作。
;抽象存储库中的数据库逻辑并使您的服务数据库不可知。让他们专注于业务逻辑。

所以选择权在你。

answer you linked 建议避免在存储库中创建太多过滤器方法。

相反,最好在存储库上有一个采用规范的查询方法。您可以传递规范的不同实现来检索产品。

虽然我个人不同意(它会泄漏调用层中的数据访问组件,因为您必须从外部接受 Specification 实例),但如果您有太多不同的过滤条件,它可能会有所帮助。
关于该答案的另一点是,显然(该问题被标记为这样),它是在谈论 DDD。您没有在问题中提到 DDD。
总的来说,我不同意大多数回答的说法; 个人

我真的对我们必须在存储库中实现的实际方法和操作感到困惑。

特定存储库应实现调用层所需的方法和操作。如果该层需要GetProductsInCategory()GetProductsByBrandId() 等方法,您应该实现这些方法。如上所述,这就是特定存储库存在的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多