Java / JSF / Spring / WebFlow DDD架构设计问题

时间:2011-04-15 16:30:48

标签: spring jsf domain-driven-design

我目前正在将一个庞大的,古老的Oracle Forms应用程序移植到JSF&我需要在域模型上做出决定。

我被锁定使用Spring JDBC模板(没有ORM)并利用DAO层来处理令人困惑的遗留数据库模式,这些模式必须由第一年的合作社设计。对于域模型,我真的想要高度优秀的东西,例如:假设有一个域对象计划。目标是OO-ify它能够执行PlanInstance.load(byId(“12345”)),PlanInstance.save(),. delete(),. create()等等。但随后出现这种情况;因为这些域对象包含对有状态bean的引用(例如存储库),所以它们不能被序列化。怎么克服这个?

最初我开始分拆如下:PlanManager(Stateless,Singleton)使用的PlanData(Statefull,SessionScoped)。通过这种方式,可以提取公共控制器代码,防止在每个会话范围的bean中复制,最重要的是允许序列化会话范围的bean。

此时我真的需要构建它OO样式以最小化复杂性,但我只是不知道当它引用有状态对象时(由于序列化错误)我如何在会话范围中拥有一个对象。

我能想到的唯一可能性就是使有状态参考瞬态变换。设计某种机制,以便在bean未被序列化时重新注入依赖项。任何人都能为我提供解决这一难题的方法吗?必须有某种模式/实践来解决我可能只是缺失的模式/实践。

1 个答案:

答案 0 :(得分:0)

我会将该状态的状态和管理保持独立(即Plan vs PlanManager。)通过使用数据访问模式(PlanManager),您可以在以后使用ORM保持开放状态,(比如说)应该重新编写db模式在未来。将州和州管理放在同一个班级(PlanInstance)违反OO单一责任原则。

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

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

一直以来,请考虑域对象的单一责任。在某些时候,可能会清楚域逻辑可以分成多个层(比如,低级和更高级逻辑),这可能会使域对象中的有状态bean变得不必要。