JPA和领域驱动的设计

JPA和领域驱动的设计不能很好地结合在一起。事实上,JPA“实体”是Fowler警告所反对的贫血数据模型的代表。我已经讨论过因此,我不会在这里详细介绍贫血数据模型是否不好(请记住:我不认为它是坏的)。但是,对于需要将依赖项注入实体的时间,标准不会帮助您。唯一的选择是@Configable,这需要AspectJ编织,这对我来说是“黑魔法”。那么,为什么不能将依赖项注入实体呢?因为它们是由您创建的,而不是由依赖注入框架创建的。好吧,有个奇怪的主意。如果JPA 3有EntityManager.create
摘要由CSDN通过智能技术生成

JPA和领域驱动的设计不能很好地结合在一起。事实上,JPA“实体”是Fowler警告所反对的贫血数据模型的代表。我已经讨论过因此,我不会在这里详细介绍贫血数据模型是否不好(请记住:我不认为它是坏的)。

但是,对于需要将依赖项注入实体的时间,标准不会帮助您。唯一的选择是@Configable,这需要AspectJ编织,这对我来说是“黑魔法”。那么,为什么不能将依赖项注入实体呢?因为它们是由您创建的,而不是由依赖注入框架创建的。

好吧,有个奇怪的主意。如果JPA 3有EntityManager.createEntity(Foo.class)让你的实体一直被管理?然后,您将能够注入与其他实体不同的依赖项(JPA已经通过关联处理)。它将如何工作?

  • JPA将需要一个DependencyManagerCdi当然是默认的依赖关系管理器,但是任何框架(Spring、guice等)都可以插入它们的实现。
  • 无论何时创建(.)您的实体将有它的依赖项集--就像该实体是由您的DI框架创建的一样。
  • 这意味着实体的“瞬态”状态将不存在(如果选择create()方法,即)

但…分离的实体,或者需要创建不应该访问实体管理器(例如控制器中)的实体的情况,是最重要的事情。我不能给你一个满意的建议。您要么需要注入EntityCreator,后者将使用实体管理器,要么使用另一个机制(如果您可能从JPA切换到其他机制)。但是这可能是一个“最佳实践”,而不是一个标准的接口,因为如果它是一个JPA接口,它仍然是Web层对JPA的直接依赖。另一种选择是通过所有层传播创建,但这是样板。第三种选择是,当分离的实体“进入”服务层时(通过AOP)自动附加。这个想法的一个缺点是人们会被诱惑注入Enti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring,可以使用领域驱动设计(Domain-Driven Design,简称DDD)模型来构建应用程序。以下是一些在Spring实施DDD的常用技术和模式: 1. 领域模型(Domain Model):使用领域对象、实体、值对象和聚合根来表示业务领域的概念和关系。可以使用Java类来表示这些领域模型。 2. 领域服务(Domain Service):在领域模型,有些业务操作不适合归属于特定的实体或值对象,这时可以使用领域服务来处理这些操作。在Spring,可以将领域服务实现为Spring的Service组件。 3. 聚合根(Aggregate Root):聚合根是领域模型的一个重要概念,它是一组相关实体和值对象的根。聚合根负责维护聚合内部对象的一致性和完整性。在Spring,可以使用注解(如`@Entity`、`@Component`)来标识聚合根类。 4. 仓储(Repository):仓储是用于持久化和检索领域对象的机制。在Spring,可以使用Spring Data JPA或者自定义的数据访问层来实现仓储。 5. 应用服务(Application Service):应用服务用于协调领域模型和应用层之间的交互,处理应用层的请求,调用相应的领域服务和仓储。可以使用Spring的Service组件来实现应用服务。 6. 值对象(Value Object):值对象是不可变的,表示某个概念的属性或组合,没有唯一标识。在Spring,可以将值对象实现为普通的Java类。 通过使用上述技术和模式,结合Spring框架的依赖注入、AOP等特性,可以更好地实现领域驱动设计,并构建具有高内聚、低耦合的Spring应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值