0

我有一个带有几个实体的树状结构:一个流程由步骤组成,一个步骤可能有子流程。假设我有两种失败模式:中止和重做。我实现了树遍历逻辑,将失败信号在树上上下级联。在中止的情况下,一切正常;abort 正确地向上和向下级联,通知其父级和子级。在重做的情况下,同样会发生,除了创建一个新进程来替换失败的进程。因为我使用的是 DataMapper 模式,所以新对象无法保存自己,也没有办法将新对象传递给 EntityManager 进行持久化,因为实体通常不了解持久性甚至服务。

那么,如果我不将 EntityManager 传递给域层,我如何才能在新对象超出范围之前了解它们的创建?

这是否是实现 AOP(例如使用 JMSAopBundle)的好案例?这是我读过的东西,但还没有真正找到有效的用例。

4

2 回答 2

0

If I understand your problem correctly (your description seems to be written a bit in a hurry), I would do the following:

  • mark your failed nodes and your new nodes with some kind of flag (i.e. dirty flag)
  • Have your tree iterator count the number of failed and new nodes
  • Repeat tree-iteration / Re-Do prcocess as often as you want, until no more failed or new nodes are there that need to be handled
于 2013-10-05T17:19:39.587 回答
0

我刚刚发现 Benjamin Eberlei 的贡献,关于更抽象层面上领域层的业务逻辑变化:Doctrine and Domain Events

博客文章的简短引用和摘要:

领域事件模式允许将事件附加到实体并仅在实体的事务成功执行时将它们分派给事件侦听器。与传统的事件分派方法相比,这有几个好处:

  • 关注域中的行为以及域触发器的变化。
  • 以非常简单的方式促进解耦
  • 除了在 Doctrine UnitOfWork 中之外,没有对事件调度程序和所有需要的侦听器的引用。
  • 无需使用在所有更新操作上触发的不明确的 Doctrine Lifecycle 事件。

需要采取行动的每种方法都应:

  1. 使用事件名称和属性调用“raise”方法。
  2. “raise”方法应该创建一个新的 DomainEvent 对象并将其设置为存储在内存实体中的事件数组。
  3. 事件监听器应该监听 Doctrine 生命周期事件(例如 postInsert),将实体保存在内存中(a)实现事件,以及(b)有事件要处理。
  4. 此事件侦听器应在 preFlush/postFlush 回调中调度一个新的(自定义)事件,其中包含感兴趣的实体和任何相关信息。
  5. 第二个事件监听器应该监听这些自定义事件并触发必要的逻辑(例如 onNewEntityAddedToTree)

我还没有实现这个,但听起来它应该以一种比我实际实现的方法更自动化的方式完成我正在寻找的东西。

于 2013-10-14T15:17:42.537 回答