Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/JSF/Spring/WebFlow DDD体系结构设计问题_Spring_Jsf_Domain Driven Design - Fatal编程技术网

Java/JSF/Spring/WebFlow DDD体系结构设计问题

Java/JSF/Spring/WebFlow DDD体系结构设计问题,spring,jsf,domain-driven-design,Spring,Jsf,Domain Driven Design,我目前正在将一个大型的、古老的Oracle表单应用程序移植到JSF&我需要对域模型做出决策 我习惯于使用SpringJDBC模板Noorm,并利用DAO层来处理令人费解的遗留数据库模式,这必须是第一年的合作所设计的。对于域模型,我真的想让事情高度面向对象,例如:假设有一个域对象计划。目标太过简单,无法执行PlanInstance.loadbyId12345、PlanInstance.save、delete、create等操作,但随后情况会出现;例如,因为这些域对象包含对有状态beanslike存

我目前正在将一个大型的、古老的Oracle表单应用程序移植到JSF&我需要对域模型做出决策

我习惯于使用SpringJDBC模板Noorm,并利用DAO层来处理令人费解的遗留数据库模式,这必须是第一年的合作所设计的。对于域模型,我真的想让事情高度面向对象,例如:假设有一个域对象计划。目标太过简单,无法执行PlanInstance.loadbyId12345、PlanInstance.save、delete、create等操作,但随后情况会出现;例如,因为这些域对象包含对有状态beanslike存储库的引用,所以它们无法序列化。如何克服这一点

最初,我开始拆分一些内容,比如:PlanDataStatefull,SessionScoped,由PlanManagerStateless和Singleton使用。通过这种方式,可以提取公共控制器代码,防止在每个会话范围bean中重复,最重要的是允许序列化会话范围bean

在这一点上,我真的需要用OO风格来构造它,以最小化复杂性,但我不知道当对象由于序列化错误而引用有状态对象时,如何在会话范围中拥有一个对象


我能想到的唯一可能性是使有状态的refs暂时化&设计某种机制在bean未序列化时重新注入依赖项。有谁能为我提供一些解决这一困境的方法?一定有某种模式/实践可以解决我可能只是缺少的问题。

我会将状态和该状态的管理分开,即计划与计划管理器。通过使用数据访问模式PlanManager,您为以后使用ORM敞开了大门,比如说,如果db模式在将来被重写的话。将状态和状态管理放在同一个类PlanInstance中违背了单一责任的OO原则

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

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

始终考虑域对象的单一责任。在某一点上,域逻辑可能会被划分为多个层次,比如说,低级逻辑和高级逻辑,这可能会使域对象中不需要有状态bean