1

我有一个关于 DDD 和 Spring 的问题。我总是围绕贫乏的领域模型和服务来设计我的应用程序来处理业务逻辑/持久性。

假设您有一个用于域对象(例如 Book)的 spring 管理的持久性/存储库服务。如果我必须在书上公开一个 save() 方法,那么我将需要我的域中的存储库 bean,否则我将不得不查找存储库 bean 的上下文。这与依赖注入完全相反。

现在,如果我将存储库 id 注入到域中并且缓存了域对象(集群缓存),然后在反序列化时它将没有注入的存储库服务,因为 spring 容器会有所不同。

我可能是错的,但如果有人可以向我解释这种情况将如何工作,那将有很大帮助

4

2 回答 2

2

我认为您的应用程序的“外观”应该使用存储库(或其他基础设施服务)来保存“书”。这本书不应该自我保存,这是存储库的责任。

如果您需要从域实体进行任何基础设施操作(例如,搜索数据库),那么您应该通过查找上下文(并因此与 Spring 耦合)或通过 Dependency 注入存储库来访问此存储库在实体中注入。

问题是实体的“实例化”不是 Spring 的责任,而是 Persistence Provider 的责任,因此 Spring 无法处理这种注入。该怎么办?

好吧,有几种方法(它们都不是很“漂亮”)来做到这一点:

  • 通过 AOP:您可以使用面向方面的框架(如 AspectJ)配置系统以在实例化时刻将任何依赖项注入实体中的代码。
  • 通过 Hibernate 拦截器:如果您的 Persistence Provider 是 Hibernate,它为您提供了一个挂钩,可以将拦截器放置在实体生命周期的某些点。您可以配置一个拦截器来查找 spring 上下文以在每个实体的实例化中注入依赖项。
  • 也许最简单的方法是实现一个小的静态“serviceLocator”,再加上spring,它在需要时查找实体询问的服务。这个服务定位器只是一个避免你的实体与 Spring 耦合的层。
于 2011-06-28T11:52:36.817 回答
1

我认为“保存”方法(例如保存在数据库中)不属于域对象......这本书是否“保存”本身?还是存储库保存它?...

于 2011-02-25T13:00:24.523 回答