由于数据库的设计,我有相当多的JpaRepository扩展存储库接口。
为了构造一个简单的对象,即Person,我必须对大约4-5个存储库进行方法调用,因为数据是这样分布在整个数据库中的。类似这样的代码(请原谅伪代码):
@Service
public class PersonConstructService {
public PersonConstructService(Repository repository,
RepositoryTwo repositoryTwo,
RepositoryThree repositoryThree) {
public Person constructPerson() {
person
.add(GetDataFromRepositoryOne())
.add(GetDataFromRepositoryTwo())
.add(GetDataFromRepositoryThree());
return person;
}
private SomeDataTypeReturnedOne GetDataFromRepositoryOne() {
repository.doSomething();
}
private SomeDataTypeReturnedTwo GetDataFromRepositoryTwo() {
repositoryTwo.doSomething();
}
private SomeDataTypeReturnedThree GetDataFromRepositoryThree() {
repositoryThree.doSomething();
}
}
}PersonConstructService类使用所有这些接口来构造一个简单的Person对象。我从PersonConstructService类内部的不同方法调用这些存储库。我考虑过将这个类扩展到多个类中,但我不认为这是正确的。
相反,我想使用一个包含创建Person对象所需的所有存储库的repositoryService。这是一种好的方法吗?在Spring中有可能吗?
我问的原因是,有时注入到一个类中的服务的数量大约是7-8个。这绝对不是什么好事。
发布于 2016-11-24 20:27:42
我认为你不能/不应该创建一个像抽象这样的元库。存储库有一个定义良好的含义,从概念上讲,它们是Hibernate/JPA/Datastore实体的CRUD服务(有时甚至更多:-)。我想这对他们来说已经足够了。任何更多的东西都是令人困惑的。
现在我要提出的是一种“智能”的方式来构建你的" Person“对象,它能够自动感知任何对Person对象的意义有贡献的新服务。
问题的症结在于:
service你可以让你的存储库实现一个给定的接口,比如说
PersonDataProvider,它会让你的@实现PersonDataProvider实例,并将它们注入到你的服务中(请参阅How to collect and inject all beans of a given type in Spring XML configuration)PersonDataProvider贡献他们的数据。我可以扩展一点,但对我来说,这似乎是一条可行的道路。
有人可能会说这不是干净的(它使你的存储库意识到在服务层发生的“一些事情”,他们不应该这样做),人们可以解决这个问题,但以这种方式暴露解决方案的要点会更简单。
编辑:因为这篇文章是第一次写的,所以我意识到Spring可以自动检测和注入特定类型的所有bean,而不需要PostProcessors。在这里查看被接受的答案:Autowire reference beans into list by type
发布于 2017-11-07 08:33:49
我认为它是一个在服务层上非常合理和实用的数据聚合。这在Spring中是完全可以实现的。如果您有权访问存储库代码,则可以将它们全部命名为:
@Repository("repoOne")
public class RepositoryOne {
@Repository("repoTwo")
public class RepositoryTwo {并根据需要将它们注入到聚合服务中:
@Service
public class MultipleRepoService {
@Autowired
@Qualifier("repoOne")
private RepositoryOne repositoryOne;
@Autowired
@Qualifier("repoTwo")
private RepositoryTwo repositoryTwo;
public void doMultipleBusiness() {
repositoryOne.one();
repositoryTwo.two();
}
}事实上,如果它们是不同的类,您甚至不需要命名和限定它们,但如果它们在层次结构中或具有相同的接口...
此外,如果自动装配不是一个案例,您可以直接注入构造方法:
public void construct(@Qualifier("repoOne")RepositoryOne repoOne,
@Qualifier("repoTwo")RepositoryTwo repoTwo) {
repoOne.one();
repoTwo.two();
}https://stackoverflow.com/questions/40780570
复制相似问题