问题描述
|
这个问题涉及如何在某些系统或用户触发的事件上有效地创建和保留事件域对象,而这些事件本身可能会也可能不会保留对数据库的更改。
我创建了一个系统,用户可以在其中标记某些对象,并且在发生标记时,我应该创建一个
UserTagEvent
,其中包含被标记的对象,已应用或移除的标记以及标记该对象的用户。 (编辑:这不是实际的TAG对象,只是标记事件的日志)
这样的可标记对象的关系是一对多的(一个可标记对象有很多标记)
据我所知,我有三种选择。
进行标记的控制器/服务中的内联代码(不要这样做,因为它混合了两个不同的业务流程。)
使用休眠侦听器在收集前进行更新和在收集后进行更新以获取必要的信息,并创建并持久保存新的“ 0”
使用AOP。
我还有其他选择吗?有人做过类似的事情吗?你们认为我应该怎么做?任何帮助表示赞赏。
解决方法
如果UserTagEvent代表实际标签还是仅作为标签事件的日志,还不是100%清楚。
使用休眠监听器在收集前更新和收集后更新来获取必要的信息,并创建并持久保存新的UserTagEvent
如果UserTagEvent是您的标签,休眠侦听器就没有多大意义,因为它们只有在您创建UserTagEvent并将其自己添加到对象中时才会被触发,而您一无所获。
进行标记的控制器/服务中的内联代码(不要这样做,因为它混合了两个不同的业务流程。)
我将从创建负责标记/标记记录的TagService开始。您可以从控制器中使用它,也可以从aop中使用它,但是应该封装以下功能:functionality2ѭ
这可能很方便,尤其是当您以后想要使用其他技术来存储事件(如某些nosql解决方案)时,该功能尤其有用。
,以下是我在探索选择时学到的知识:
1)控制器/服务中的内联代码
标记(不想这样做)
混合两种不同的业务
流程。)
没有尝试这个替代方法
2)使用休眠监听器进行预收集更新和
收集后更新以获取
必要的信息并创建和
坚持一个新的UserTagEvent
由于多种原因,这被证明是非常困难,低效和成问题的。
例如,您正在处理可能会或可能不会进行延迟初始化的项目集合。为了检测集合中的更改,我必须侦听集合初始化事件,获取克隆的集合,将其存储到字段变量,然后侦听更新集合事件,获取克隆的集合,并将其与先前存储的集合进行比较。
另外,这些事件是针对所有休眠事件触发的,而不仅仅是针对我感兴趣的域对象。因此,这是“不行” ...
3)使用AOP。
最初,我对这种解决方案非常乐观,经过几次尝试,我很快意识到这并不像我最初想到的那么简单。网络上很少有描述Grails和AOP的指南,并且存在的指南很旧。
涉及的工作比我最初想象的要多。我的总体印象是grails似乎有很多与AOP集成相关的错误,而且我也不喜欢必须为我创建的每个方面都将bean定义添加到resources.groovy的事实。我试图通过注释(自动代理)自动加载方面,但是没有运气。
另外,我从来没有在主要项目之外工作的切入点。由于我的标记解决方案定义为grails插件,因此AOP似乎无法应用于该插件的类(即使它是就地插件)。
因此,这也证明是“不行”
所以请打鼓。
我最终得到的结果是,每当添加或删除新标签时,就使用观察者模式触发事件。这涉及到对我的tagger插件进行更改,在这里我可以通过spring bean(whicn实现了TagEventListener接口)指定侦听器,并让tagger插件在调用addTag和removeTag方法时触发spring bean上的事件。
总体而言,我对该解决方案非常满意,它涉及一个或两个以上的方法调用,然后如果我按照选项1所述进行内联,则将需要进行方法调用。但是这样一来,我的代码更加简洁,而且我不会混合业务流程。所以我认为额外的1ns开销是值得的。