java - 关于正确实现复杂的服务层

标签 java hibernate spring design-patterns dao

我有以下情况:

三个具体的服务类实现了一个服务接口(interface):一个用于持久化,另一个处理通知,第三个处理为特定操作添加点(游戏化)。界面大致结构如下:

public interface IPhotoService {
   void upload();
   Photo get(Long id);
   void like(Long id);
   //etc...
}

我不想将这三种类型的逻辑混合到一个服务中(或者更糟,在 Controller 类中),因为我希望能够毫无问题地更改它们(或关闭它们)。当我必须将具体服务注入(inject) Controller 才能使用时,问题就来了。通常,我会创建第四个类,大致命名为 ApplicationNamePhotoService,它实现相同的接口(interface),并作为其他三个服务之间的包装器(中介),它从 Controller 获取输入,并调用每个服务相应地。尽管这是一种可行的方法,但它会创建大量样板代码。

这是正确的方法吗?目前,我不知道有更好的方法,但我非常感谢知道是否有可能以声明方式(在上下文中)声明执行序列并使用动态生成的包装器实例注入(inject) Controller 。

另外,最好在三个服务之间缓存一些内容。例如,所有人都在使用 DAO,即有时一遍又一遍地对数据库进行相同的调用。如果所有的逻辑都放在一个本来可以避免的地方,但现在......我知道可以启用一些基于请求或 session 的缓存。你能给我一些示例代码吗?顺便说一句,我在持久性部分使用 Hibernate。是否已经提供了一些缓存(可能,如果它们驻留在同一个事务或其他东西中 - 对于那个我完全迷路了)

最佳答案

服务层应该由具有方法的类组成,这些方法是具有属于同一事务的操作的工作单元。听起来您正在混合服务类,而它们可能在同一个类和方法中。您也可以在需要时将服务类相互注入(inject),而不是创建另一个“中介”。

“混合三种逻辑”是完全可以接受的,事实上,如果它们形成预期的用例/工作单元,则更可取

缓存我希望使用 eh cache我相信,它与 hibernate 很好地集成了。

关于java - 关于正确实现复杂的服务层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010088/

相关文章:

java - 无法自动配置 session 存储库,请检查您的配置( session 存储类型为 'null' )

java - while 循环创建无限循环,尽管条件在 java 中变为 false

java - 多个 Hibernate 配置

java - OSIV 模式 - 优点和缺点?关于 OSIV 和观点的一般问题

java - 我可以在 mvn 中指定自定义生命周期方法吗

spring - MultiTenantSpringLiquibase 示例。

Java:将包含的 Jar 文件添加到在 linux 中创建的 Jar 文件

java - Spring Controller - 将 JSON 属性映射到外键实体

java - 编写/组织 JBehave 故事的良好做法有哪些?

java - JPA(Hibernate)保存ManyToOne关系的问题