2011-04-15 52 views
1

我目前正在将大型古老的Oracle Forms应用程序移植到JSF &我需要对领域模型做出决定。Java/JSF/Spring/WebFlow DDD体系结构设计问题

我被锁定在使用Spring JDBC模板(无ORM),并利用DAO层来处理令人困惑的遗留数据库模式,这一模式一定是第一年合作社设计的。对于领域模型,我真的想把事情做得很高OO,例如:假设有一个域对象计划。目标将太OO-如果它能够执行PlanInstance.load(byId(“12345”)),PlanInstance.save(),.delete(),.create()等等。但是随后出现这种情况;因为这些域对象包含对有状态bean的引用(比如Repositories),所以它们不能被序列化。如何克服这一点?

最初我开始分裂的东西,如:PlanData(Stateless,Singleton)使用的PlanData(Statefull,SessionScoped)。通过这种方式,公共控制器代码被提取并且被阻止在每个会话作用域bean中被复制,并且最重要的是允许会话作用域bean被序列化。在这一点上,我真的需要构造它OO风格以最大限度地减少复杂性,但是我只是不知道如何在会话范围中引用状态对象(由于序列化错误)时如何获得对象。

我能想到的唯一可能性是使状态引用暂态&设计了某种机制,以便在bean未序列化时重新注入依赖关系。任何人都可以向我提供解决这一难题的任何见解吗?必须有某种模式/实践来解决我可能只是失踪的问题。

回答

0

我会保持该状态的状态和管理是分开的(即Plan与PlanManager)。通过使用数据访问模式(PlanManager),您可以保持开放以便稍后使用ORM(比方说)如果db模式是将来重做。将国家和国家管理层放在同一个班级(PlanInstance)是违背OO单一责任原则的。

有状态会话有作用域的bean本身没有被序列化(至少不会存储在持久性存储中 - 但可能会序列化它们以支持会话故障切换)。控制器和会话bean维护对数据bean的引用。

有状态bean决定何时加载,调用逻辑,更改状态并保存数据对象。它们为您的域对象提供上下文。在一些设计中(通常被称为“贫血域模型”),域对象没有行为,并且所有逻辑都存在于无状态服务中。如果我理解正确,你想在你的域对象中封装状态和行为,并且域对象需要使用有状态会话bean来执行他们的工作。在可能的情况下,尝试将域对象中的功能分解为不依赖于会话状态(将使测试更简单)或将该功能推送到使用适当的会话状态调用的服务bean中。如果您别无选择,只能使用对来自域模型行为的有状态bean的引用,那么有状态bean可以将必要的状态/存储库引用作为参数提供给域对象上的方法调用。这样,域对象仍然是无状态的,但可以使用有状态bean来实现域逻辑。

一直以来,都考虑域对象的单一职责。在某些时候,域逻辑可能会分裂成多层(比如低层和更高层的逻辑),这可能会导致对域对象中有状态bean的需求变得不必要。