我必须满足以下要求:
[...]如果登录的用户闲置超过 30 分钟,他必须退出。
其中空闲表示“不按鼠标或键盘”。
现在,当我第一次阅读它时,我很确定如何实现这一点:对我来说,这听起来像是与业务逻辑有关的需求,所以我应该在业务层实现它(具有 3 层架构) .
这里有一些代码:
// simplified and generalized version of my login method
public boolean login(String email, String password) {
user = dao.read(email, password); //returns either null or the user
boolean logged = user != null;
if (logged) {
// initialize Session somehow, let's say for example:
Session.start();
}
return logged;
}
// simplified and generalized version of my logout method
public void logout() {
operatore = null;
// terminate Session somehow, let's say for example:
Session.destroy();
}
这将是理想的,但有一个问题:Session
应该知道如何检测用户不活动(然后触发logout()
方法)......但不幸的是,这完全取决于 GUI 的制作方式!
[要明确一点:我知道我要实现这一点,但我想独立于我如何实现 UI(例如 Java Swing、命令行、基于 Web 等)来完成它]
我的意思是,业务层不能(也不应该)捕获用户事件/交互,所以我应该Session
在 GUI 包中实现并 从那里使用它:在我的设计中,一个层应该只与其严格的下层接口交互,并且不应该知道任何更高级别(数据访问层是独立的(嗯,它依赖于数据库和其他持久性机制),业务层只依赖于数据访问层接口,表示层只依赖于业务层接口)。
问题是,我认为在表示层中实现业务逻辑需求的一部分对我来说是错误的。
顺便说一句,会话到期可能与表示逻辑有太多关系,因为必须“听”用户输入。
这让我想起了前段时间我自己回答的另一个相关问题,但为了避免任何疑问,我也会问这个问题:link to the question。
我想听听一些有价值的意见,主要集中在良好的设计实践上。