4

我发现有一个名为 GraphRepository 的接口。我有一个用于实现其工作的自制接口的用户存储库,但我想知道,我不应该实现 GraphRepository 吗?即使实现起来会很长,有些方法没用,但我认为这是一个标准,我已经重新编写了很多在这个接口中定义的方法。

那么我应该编写“YAGNI”代码还是不遵守标准?你有什么建议?

4

1 回答 1

11

您不需要实际实现 GraphRepository 而是扩展它。的原则Spring-Data是所有样板 CRUD 代码都得到处理(通过在启动时代理),所以您所要做的就是为扩展 GraphRepository 的特定实体创建一个接口,然后只添加您需要的特定方法。

例如; 如果我有一个实体CustomerNode,要创建标准 CRUD 方法,我可以创建一个新接口CustomerNodeRepository extends GraphRepository<CustomerNode,Long>。所有的方法GraphRepository(例如 save、findAll、findOne、delete、deleteAll 等)现在都可以从Spring-Data-Neo4J 访问CustomerNodeRepository并由 Spring-Data-Neo4J 实现,而无需编写单行实现代码。

该模式现在允许您处理特定的存储库代码(例如 findByNameAndDateOfBirth),而不是简单的 CRUD 内容。

Spring-Data 包对于存储库交互非常有用。它可以减少大量代码(代码行减少了 80% 以上),强烈推荐使用它

编辑:实现自定义执行

如果您想将自己的自定义行为添加到 Repository 方法,则创建合并接口和自定义实现的概念。例如,假设我想创建一个名为的方法findCustomerNodeBySomeStrangeCriteria并执行此操作,我实际上想链接到关系数据库以执行该功能。

首先,我们定义一个单独的、独立的接口,它只包含我们的“额外”方法。

public interface CustomCustomerNodeRepository {
   List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object strangeCriteria);
}

接下来我们更新我们的普通接口,不仅扩展 GraphRepository,还扩展我们的新自定义接口

public interface CustomerNodeRepository extends GraphRepository<CustomerNode,Long>, CustomCustomerNodeRepository {

}

最后一部分,是实际实现我们的findCustomerNodeBySomeStrangeCriteria方法

public class CustomerNodeRepositoryImpl implements CustomCustomerNodeRepository {

   public List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object criteria) {
    //implementation code
}

}

所以,有几点需要注意;

  • 我们创建一个单独的接口来定义具有自定义实现的任何自定义方法(与 Spring-Data 兼容的“findBy ...”方法不同)
  • 我们的 CustomerNodeRepository 接口(我们的“主”接口)扩展了 GraphRepository我们的“自定义”接口
  • 我们在实现自定义接口的类中只实现“自定义”方法
  • “自定义”实现类必须(默认)被称为我们的“主”接口Impl,才能被 Spring Data 拾取(所以在这种情况下CustomNodeRepositoryImpl

在幕后,Spring Data 提供了一个代理实现CustomerNodeRepository作为自动构建GraphRepository和我们的类实现的合并CustomCustomerNodeRepository。类名称的原因是允许 Spring Data 轻松/成功地拾取它(这可以被覆盖,因此它不会查找 *Impl)

于 2013-07-21T14:07:27.080 回答