我需要在Java EE环境中对三个软件体系结构层(下面列出)进行可靠的解释,这是我从多个上下文中获取的。简而言之,这就是我所获得的:
在浏览了多篇文章之后,我对服务层和持久层之间的区别位置感到困惑 - 它们是否重叠或是彼此的同义词?我从来没有在真正相同的背景下听到过它们。
所有这些层是否总是使用/容易区分?
谢谢。
Service层封装了应用程序的业务逻辑和计算。单词Service用于强调使用Service-oriented design principles建模的业务逻辑层可以由不同的消费者使用的点,例如,Web表示层,API集成层,远程移动客户端,其他服务等。服务的示例可以是PayrollService
,DiscountService
,OrderService
等。这允许业务逻辑被编写一次并在不同技术,位置和应用程序的多个地方消费。
持久层负责向服务层提供数据访问操作。为了遵循松散耦合的原则,服务层不应该担心数据的存储方式和位置 - 只需要它可以在需要时访问所需的数据。服务层应该简单地将所需的业务逻辑应用于数据,使得数据访问代码与业务逻辑代码(在任何严肃的企业应用程序中)分离。
存储库是一种常用于实现持久层的设计模式。在许多其他方面,它允许将应用程序数据建模和管理为域模型(技术团队成员和业务用户共享对业务域的共同理解的方式)。这允许使用Domain-driven design,确保技术和非技术用户共享一个共同的术语,并且技术工件尽可能地模仿现实世界的对应物。存储库模式也很有用,因为它允许服务层通过一致的接口访问所有(或至少大多数)数据源(大多数提供基于存储库的持久层的框架在所有存储库上提供基本的CRUD方法)。存储库的例子可能是OrderRepository
,PersonRepository
,DepartmentRepository
等.Martin Fowler的网站有excellent overview of the repository pattern。
也就是说,存储库不是设计和实现持久层的唯一方法 - 它也可以通过其他方式实现,最简单的方法是使用本机数据访问技术,如JDBC,ODBC,ADO.NET等。
现在,为了回答这个问题,服务和持久层应该在一个正确构建的软件系统中分开,以提供系统的业务逻辑和数据访问组件之间的松散耦合(如果您同意业务逻辑和数据访问是两个独立的问题)。有关将各个应用问题封装为单独组件的入门知识,请参阅SOLID principle。这两层之间的任何重叠都会很糟糕,因为它会导致硬耦合,可能的代码重复,分散的错误,代码不灵活等。
存储库是一种设计模式,也是实现持久层的可能方式之一,尽管还有其他方法可以实现持久层。以下视觉描述可能有所帮助:
------------------------------- -------------------------------
| W e b l a y e r | | A P I l a y e r |
------------------------------- -------------------------------
-------------------------------------------------------------------------------
| S e r v i c e l a y e r |
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
| P e r s i s t e n c e l a y e r |
-------------------------------------------------------------------------------
---------------------------
/ /
---------------------------
/ /
---------------------------
/ D a t a S t o r e s /
---------------------------