Gwt 春季Roo+;吕震中本:若有,工厂仍然是一条路吗;“双重控制”;每个数据操作都需要什么?

Gwt 春季Roo+;吕震中本:若有,工厂仍然是一条路吗;“双重控制”;每个数据操作都需要什么?,gwt,spring-roo,Gwt,Spring Roo,我们的应用程序中的一个要求是对所有东西实施“双重控制”,包括CRUD操作。 需要明确的是,“双重控制”是一种功能,它要求数据的更改必须得到更改请求者以外的人的批准。因此,当用户更改数据时,数据不会直接提交到生产表。我知道有几种方法可以实现这一点(例如,暂存表),但这是另一种方法 问题是,有了这样的需求,您认为我们是否应该遵循标准的“以数据为中心”的生成Roo+GWT的方式(使用RequestFactory) 或者我们最好实现我们自己的基于“命令模式”的框架来支持双重控制 我倾向于后者。我的直觉(

我们的应用程序中的一个要求是对所有东西实施“双重控制”,包括CRUD操作。 需要明确的是,“双重控制”是一种功能,它要求数据的更改必须得到更改请求者以外的人的批准。因此,当用户更改数据时,数据不会直接提交到生产表。我知道有几种方法可以实现这一点(例如,暂存表),但这是另一种方法

问题是,有了这样的需求,您认为我们是否应该遵循标准的“以数据为中心”的生成Roo+GWT的方式(使用RequestFactory)

或者我们最好实现我们自己的基于“命令模式”的框架来支持双重控制


我倾向于后者。我的直觉(基于3天的Roo+GWT游戏)说RequestFactory的设计并没有考虑双重控制,如果我们试图强行进入,我们会撞到墙。如果在这里被证明是错误的,我会非常高兴。

你看过RequestFactory的吗?它调解负载处理与域对象和代码之间的所有交互。例如,您可以覆盖
getProperty
setProperty
方法,以读取和写入保存挂起突变的某种“影子”日志

如果需要为对象、方法或属性实现ACL,可以使用
loadDomainObject
resolveX
方法来控制任何给定请求可以与哪些服务器端类交互

要连接自定义装饰器,您可以子类化
RequestFactoryServlet
并调用两个参数构造函数。或者,您可以使用从返回的对象实例化
SimpleRequestProcessor

实现说明:RequestFactory的所有默认域交互行为都是使用一系列
ServiceLayerCorators
构建的;如果您想查看构建
servicelayercorator
的示例代码,请查看GWT源代码。需要注意的一点是,如果装饰程序调用
ServiceLayer
API中定义的任何方法,它应该使用
getTop()
提供的实例<代码> Service Error DealStudio< /Calp>实例将是无状态的和可重用的,因此如果需要在方法调用之间保持状态,请考虑使用<代码> THEADEngEng/<代码>变量,类似于<代码> RequestFactoryServlet .GETTHealListalx()/< > >

< P>它真正取决于您想要什么“用户体验”,尤其是您是否希望用户验证已更改内容的“差异”,或批准“新版本”(快照)

如果您想要差异,因为RequestFactory只将差异(即用户或您编写的代码对对象所做的实际更改)发送到服务器,那么拦截Bob建议的
setProperty
调用肯定是一种方法(让Bob的建议更清楚一点:您可以“存储”静态
ThreadLocal
中的差异,以便您可以从服务调用中检索它)。您还可以使用“更智能”的域对象,当它们的setter被调用时,它们会构建一个内部差异;然后,对象本身上的每个对象都可以访问diff

如果您想要快照,那么您只需实现您的服务,将修改后的对象存储在“staging tables”或任何东西中,而不是存储在“production tables”中;然后在调用“批准”服务时将它们“移动”到“生产表”


(对我来说)有一点很清楚,那就是你必须围绕“双重控制”对你的服务和/或对象进行建模,而不是试图在“简单的CRUD”操作中进行建模(即,“保存”不是“保存”,而是“发送审批”;还有一个单独的“审批”操作)。

非常有用的指针。这似乎是正确的方向。如果你的回答确实符合我们的需要,我会看一看并接受。显然,3天不足以掌握一切。:)请原谅我的无知,但是如果您针对的是服务器场而不是单个主机运行,ThreadLocal不会导致问题(不起作用)吗?不会。servlet(除非使用Servlets 3.0,而RequestFactoryServlet不会)在单个服务器上的单个线程中处理请求。这里的ThreadLocal的目标只是在处理同一HTTP请求的位的断开连接的部分之间共享内容。这不是在请求之间共享东西(可以将请求分派到服务器场中的不同服务器)。