我发现有一个名为GraphRepository的接口。我有一个存储库,供用户实现自己的接口来完成它的工作,但我想知道,我不应该实现GraphRepository吗?即使实现起来很长,有些方法也没用,我认为这是一个标准,我已经重新编写了很多在这个接口中定义的方法。
我应该写“YAGNI”代码还是不尊重标准? 你的建议是什么?
答案 0 :(得分:11)
您不需要实际实现GraphRepository,而是扩展它。 Spring-Data
的原理是所有的样板CRUD代码都是由(通过在启动时代理)处理的,所以你要做的就是为扩展GraphRepository的特定实体创建一个接口,然后只添加特定的方法你需要的。
;如果我有一个实体CustomerNode
,要创建标准的CRUD方法,我可以创建一个新的接口CustomerNodeRepository extends GraphRepository<CustomerNode,Long>
。现在可以从GraphRepository
访问CustomerNodeRepository
中的所有方法(例如save,findAll,findOne,delete,deleteAll等),并由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
}
}
所以,有几点值得注意;
Impl
才能被Spring Data选中(所以在这种情况下CustomNodeRepositoryImpl
)在幕后,Spring Data提供了CustomerNodeRepository
的代理实现,作为自动构建的GraphRepository
和我们实现CustomCustomerNodeRepository
的类的合并。类的名称的原因是允许Spring Data轻松/成功地获取它(可以被覆盖,因此它不会寻找* Impl)