我有以下情况:
三个具体的服务类实现了一个服务接口(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/