一尘不染

Spring and the anemic domain model

spring

因此,我已经注意到,我肯定有一种样式化Spring / Hibernate堆栈对象的趋势,如下所示:

  • Foo控制器调用“ FooService”
  • FooService调用FooRepository.getById()方法来获取一些Foos。
  • FooRepository进行一些Hibernate调用以加载Foo对象。
  • FooService与Foos进行了一些交互。它可以使用相关的TransactionalFooService来处理事务中需要一起完成的事情。
  • FooService要求FooRepository保存Foos。

这里的问题是,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还会用其他方法做什么吗?你是否使用诸如加载时编织(我对此不太满意)这样的花哨技巧来与之抗衡?你还有别的把戏吗?你认为程序是否合适?


阅读 373

收藏
2020-04-19

共1个答案

一尘不染

你可以让Spring使用AOP将服务注入到Hibernate实例化实例中。你还可以使用拦截器让Hibernate进行相同的操作。

关于“让Foo进行事务性事务很烦人”,我希望你的服务实现会知道/关心事务,如果你现在在域模型中使用服务接口,那现在应该还不完全很烦人。

我怀疑决定何时保存域模型取决于它是什么以及你在做什么。

FWIW我倾向于产生相同类型的anemic structures,但是我到了那里,现在我知道有可能以更明智的方式做到这一点。

2020-04-19