尽管我已经将此标记为java/spring问题,但对于任何带有无状态控制器的mvc框架,都可以很容易地问到它。例如,我知道rails使用简单的无状态控制器,所以也许你们知道如何最好地解决这个问题。我可以最好地描述java/spring的问题,它是实现--请原谅java术语。
The issue
在spring中,我们很难找到一种令人满意的实现无状态状态切换的方法。从本质上讲,给出了如下的结构:
模型:Unit,状态:撤回、可用、不可用,操作:getOutline()和getHelp()
控制器:UnitController和操作:displayOutline()和displayHelp()
在执行displayOutline()操作之前,我们需要一种检查单元状态的方法(因为单元本身可能被撤回,因此用户应该被转发到撤回的页面)。
我们尝试了很多方法,包括:
死的简单方式(任何语言)
控制器中需要“可用”状态单元的所有方法都在其实现的第一行调用方法isAvailable()。很明显这里有很多复制,很臭。
AOP way (Java专用)
可以创建一个@Around通知,名为UnitAccess,它执行检查并重新路由控制流(即,不调用does ()调用底层方法,它调用控制器上的另一个方法)。这似乎是一个黑客,而不是真正的AOP,如果它确实删除了复制,但增加了复杂性和降低透明度。
是一个拦截器(由servlet架构提供,但可能可以在其他框架中实现)
它检查单元状态并本质上更改实际的URL调用。再一次,这似乎不对。我们不喜欢在进入控制器之前调用模型逻辑的想法。
我们考虑过
命令模式
创建命令模式结构,该结构(通过继承)可以返回退出的视图或有效的displayOutline视图。因为execute方法将在super()调用中执行检查,并在具体命令中执行特定的逻辑。创建对象结构,如
DisplayOutlineCommand extends UnitCommand
public void execute(){
super();
// must be ok, perform getOutline()
},最后,使用自定义异常
在返回单元之前,在服务级别对象上调用getAvailableUnit(),这将对可用性等进行检查。如果单元被撤回,那么它将抛出一个UnitWithdrawnException,这个UnitWithdrawnException可以被servlet捕获并通过返回一个适当的视图来处理。仍然没有被说服。对于将异常用于正常流控制的想法,我们也不感兴趣。
我们漏掉了什么吗?在spring/另一个无状态控制器框架下,是否有一种简单的方法可以做到这一点?
发布于 2009-12-06 18:44:35
也许我错过了重点,但是如果单元被撤回,为什么用户要来找控制器呢?
我认为最好是确保通常页面不链接到控制器,如果单元不是'OK',那么控制器就需要'OK‘。如果Unit的状态在呈现引用页和实际调用到控制器(不再是'OK')之间发生了变化,那么使用异常来处理该事件对我来说是非常好的(就像在出现乐观锁定错误时有异常一样)。
发布于 2009-09-11 06:02:55
也许您还没有描述整个问题,但是为什么不将检查放在displayOutline()本身中呢?可能是路由到displayOutlineOrHelp()方法,它本质上类似于
ModelAndView displayOutlineOrHelp(...) {
Unit unit = ... //code to get the unit the request refers to
return unit.isAvailable() ? displayOutline(...) : displayHelp(...);
}https://stackoverflow.com/questions/1409185
复制相似问题