2011-02-24 33 views
1

我对DDD & Spring有个疑问。我总是围绕贫血域模型和服务来设计我的应用程序,关注业务逻辑/持久性。使用Spring进行域驱动编程

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

现在,如果我有存储库ID注入域和域对象被缓存(集群缓存),然后反序列化它将不会有注入的存储库服务,因为弹簧容器将不同。

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

+0

存储库是传统领域的一部分,正确吗?至少,如果我们将“域驱动设计”这本书中的指示视为传统。 – 2011-02-24 23:06:57

+0

即使那时库是由Spring管理的我们如何在不违反DI概念的情况下注入这些存储库 – Jany 2011-02-25 05:18:55

回答

1

我认为一个“保存”方法(保存在一个数据库,例如)不属于域对象......这本书是否“保存”自己?或者是存储库保存它?...

+0

+1 save/update/delete ...操作不属于域对象本身。 – fmucar 2011-02-25 13:15:03

+0

保存方法属于域对象,它是存储库保存的委托。如果将存储移动到存储库服务,则业务/服务层将调用存储库以保存转向服务分层体系结构的域。我想我必须开始阅读DDD才能清楚地理解我的概念 – Jany 2011-02-25 14:55:46

2

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

如果您需要从域实体进行任何基础架构操作(例如搜索数据库),那么您应该通过查看上下文(并结合Spring)或注入来访问此存储库通过实体中的依赖注入来存储库。

问题是,实体的“实例化”不是Spring的责任,而是持久性提供者的责任,所以Spring无法处理这种注入。该怎么办?

嗯,有几种方式(没有人很“beautyful”)来做到这一点:

  • 通过AOP:您可以仪器面向方面框架(如AspectJ的)配置系统的代码注入在实例化时刻实体中的任何依赖。
  • 通过Hibernate拦截器:如果您的持久性提供程序是Hibernate,它将为您提供一个挂钩,以便在实体的生命周期的某些点放置拦截器。你可以配置一个拦截器来查找spring context来在每个实体的实例化中注入依赖关系。
  • 也许最简单的方法是实现一个小的和静态的“serviceLocator”,再加上Spring查询实体在他们需要时询问的服务。这个服务定位器只是一个避免你的实体与Spring耦合的层。
相关问题