我发现有一个叫做GraphRepository的接口。我有一个为用户实现自制接口的存储库,它能够胜任其工作,但我在想,我是否应该实现GraphRepository呢?即使这将花费很长时间来实现,并且有些方法可能是无用的,但我认为这是一种标准,而且我已经重新编码了很多在此接口中定义的方法。
所以我应该写“YAGNI”代码还是遵守标准?你有什么建议吗?
我发现有一个叫做GraphRepository的接口。我有一个为用户实现自制接口的存储库,它能够胜任其工作,但我在想,我是否应该实现GraphRepository呢?即使这将花费很长时间来实现,并且有些方法可能是无用的,但我认为这是一种标准,而且我已经重新编码了很多在此接口中定义的方法。
所以我应该写“YAGNI”代码还是遵守标准?你有什么建议吗?
您无需实际实现GraphRepository,只需扩展它即可。Spring-Data的原则是通过代理启动时间来处理所有样板文件CRUD代码,因此您只需为特定实体创建一个扩展GraphRepository的接口,然后仅添加所需的特定方法。
例如;如果我有一个实体CustomerNode,要创建标准的CRUD方法,我可以创建一个新接口CustomerNodeRepository扩展GraphRepository<CustomerNode,Long>。现在可以从CustomerNodeRepository访问GraphRepository的所有方法(例如save、findAll、findOne、delete、deleteAll等),而不必编写一行实现代码,Spring-Data-Neo4J会为我们实现这些方法。
现在该模式允许您专注于特定存储库代码(例如findByNameAndDateOfBirth),而不是简单的CRUD内容。
Spring-Data包对存储库交互非常有用。它可以减少大量代码(看到过80%以上的代码行数减少),强烈建议使用它。
编辑:实施自定义执行
如果想要向存储库方法添加自定义行为,则需要创建合并接口和自定义实现的概念。例如,假设我想创建一个名为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会将自动构建的GraphRepository
和我们实现的CustomCustomerNodeRepository
类合并成CustomerNodeRepository
的代理实现。该类名称的原因是为了使Spring Data能够轻松/成功地找到它(这可以被覆盖,以便它不再寻找*Impl)。
GraphRepository
中? - incomplete-co.de