【发布时间】:2009-08-20 06:06:02
【问题描述】:
所以,我注意到我肯定倾向于像这样对 Spring/Hibernate 堆栈对象进行模式化:
- Foo 控制器调用“FooService”
- FooService 调用 FooRepository.getById() 方法来获取一些 Foo。
- FooRepository 进行一些 Hibernate 调用以加载 Foo 对象。
- FooService 与 Foos 进行一些交互。它可以使用相关的 TransactionalFooService 来处理需要在事务中一起完成的事情。
- FooService 要求 FooRepository 保存 Foo。
这里的问题是Foos没有任何真正的逻辑。例如,如果每次 Foo 过期时都需要发送电子邮件,则不需要调用 Foo.expire()。调用了 FooService.expireFoo(fooId)。这有多种原因:
- 从 Foo 获取其他服务和对象很烦人。它不是 Spring bean,它是由 Hibernate 加载的。
- 让 Foo 以事务方式做几件事很烦人。
- 很难决定 Foo 是否应该负责选择何时保存自己。如果你调用 foo.setName(),foo 应该坚持这个改变吗?它应该等到你调用 foo.save() 吗? foo.save() 应该只调用 FooRepository.save(this) 吗?
因此,出于这些原因,我的 Spring 域对象基本上是带有一些验证逻辑的美化结构。也许这没关系。也许 Web 服务可以作为过程代码。也许随着新功能的编写,创建以新方式处理相同旧对象的新服务是可以接受的。
但我想摆脱这种设计,我想知道 Spring 的其他用途对此做了什么?您是否使用加载时间编织(我不太习惯)等花哨的技巧来对抗它?你还有什么妙招吗?你觉得程序没问题?
【问题讨论】:
-
我一直在思考的好问题。这里也有一些很好的答案。