存储库和服务层之间的区别

我查看了一些相关的问题,但仍然没有看到存储库和服务层之间有太大的区别。所以给定这个例子,我想它应该看起来像这样,如果不是,请告诉我为什么?

public interface ProductRepository extends CrudRepository<Product, Long>{

    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

public interface ProductService {

    public List<Product> findAll();
    public Product findById(Long id);
    public Product save(Product product);
    public void delete(Product product);
    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

产品服务的实现将使用产品存储库来实现这些方法。正如我从 http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html 中了解到的,对存储库中的方法的查询是自动生成的。在我的示例中,这些方法在存储库和服务中重复,因此请解释需要更改的内容/原因?


答案 1

所有业务逻辑都应位于服务层中。

对数据库(任何存储)的任何访问都应转到存储库层。

让我们举个例子。您必须保存一个实体(人)。但在保存此人之前,您需要确保此人的名字尚不存在。

因此,验证部分应转到业务层。

在服务层中

PersonRepository repository; 
public Person save(Person p){
   Person p = findByName(p.getName();
   if (p != null){
          return some customException();
   }
   return repository.save(p); 
}

public Person findByName(String name){
     return repository.findByName(name);
}

在您的存储库层中,只需专注于数据库操作即可。

您可以在存储库层中自己执行此操作。假设您已经在存储库中实现了此功能,那么您的保存方法始终在保存之前进行检查(您可能不需要这样做)。


答案 2

存储库层为您提供了对数据访问的额外抽象级别。存储库层公开基本的 CRUD 操作。

服务层公开使用存储库的业务逻辑。

您可以在此处阅读更详细的答案:https://stackoverflow.com/a/5049454/1446006


推荐