我有一个Server
对象,它是在应用程序运行时获得的,我需要在应用程序的持续时间内保留它。它只是一个带有id和hostname的模型对象。
从良好的软件设计和关注点分离的角度来看,对象将存储在何处以及如何访问?
让我提供一些代码。
public interface ServerDao{
Server findByHost(String host);
}
这是我从DAO获取对象的方法。实施无关紧要。
现在让我们说我想要一个名为getCurrentServer
的方法,可以在整个应用程序中调用它,并获取属于正在运行的机器的Server
对象应用程序(基于主机名)。
public Server getCurrentServer() {
ServerDao dao = // some way to get it
try {
return dao.findByHost(InetAddress.getLocalHost().getHostName());
} catch (UnknownHostException e) {
LOGGER.error("Host not found", e);
}
return null;
}
将它放入ServerDao
课程可能是一个坏主意。将它放入我的Application
课程可能是一个坏主意。
我会在哪里放置这样的方法?我应该创建一个ServerContext
类,其中包含Server
的单例吗?什么是标准方法?
感谢。
答案 0 :(得分:0)
你有一台CurrentServer。要实现的重要一点是,CurrentServer是一个选择,并且该选择由一个更新并在整个应用程序状态中共享。
如果您希望在应用程序的运行之间保持这种状态,则可能需要具有显式存储的CurrentServer DAO。然后,每个组件都可以选择CurrentServer并可能更新它。
这意味着您需要数据库中只能有一个值的主键。数据类型为布尔值的主键列current
,其他人选择的值为True
应该可以解决问题。
现在您可以拥有多个数据实例,但实例可能会变得陈旧。这比单身人士方法最终会引起的争用更容易解释(并且更具可扩展性)。
public CurrentServer getCurrentServer() {
CurrentServerDao dao = new CurrentServerDaoImpl(new DefaultDatabaseService());
try {
return dao.findByCurrent(Boolean.TRUE);
} catch (UnknownHostException e) {
LOGGER.error("Host not found", e);
}
return null;
}