gpt4 book ai didi

java - 使用构建器模式时防止静态注入(inject)

转载 作者:行者123 更新时间:2023-11-30 07:51:25 25 4
gpt4 key购买 nike

简介

我正在将 Dagger 2 用于一个使用 DDD 原则建模的项目。 。

我想使用 Builder Pattern创建复杂实体,我通常获取构建器实例的方式是使用静态工厂方法:ComplexEntity.builder()

聚合根将获得强类型ID,即ComplexEntityID,它需要新实例的值生成器。现在我的模块中有一个方法:@Provides ComplexEntityID ProvideComplexEntityID(IdValueGenerator Generator) { return new ComplexEntityID(generator.nextId(); }.

ComplexEntityBuilder 需要一个 ComplexEntityID 实例(或提供程序)才能创建 ComplexEntity。但是 Guice 和 Dagger(以及其他人)的人们建议不要使用静态注入(inject),这是有充分理由的。

问题

如何使用构建器创建 ComplexEntity 实例,而不使用静态注入(inject)?换句话说,如何获取构建器的实例?

坚持使用ComplexEntity.builder()会很好,因为这是一个常见的约定,但我认为这是在不使用的情况下在静态方法中使实例可用的唯一方法new()关键字是通过静态注入(inject)的方式实现的。

我能想到的另一种方法是创建ComplexEntityFactory并将builder()方法放在那里。但同时使用工厂和构建器似乎有点奇怪:

  1. 在您需要的类中注入(inject)工厂
  2. complexEntityFactory.builder().value1(...)
    .value2(...)
    .build();

在这种情况下,推荐的方法是什么?

编辑:如果它毕竟是一个专用工厂,如果这个工厂仍然可以使用 AutoFactory 生成,那就太好了或类似的东西

最佳答案

我认为有一个比 jaco0646 在评论中提出的解决方案更优雅的解决方案:

构建器是一种特殊的服务:您使用它们来实现特定目标,但它们在域内没有生命周期或意义。

因此,只需像注入(inject)任何其他服务一样注入(inject)构建器即可。

这有几个优点:

  • 构建者可以通过依赖其他服务和工厂来使用它们。在您的情况下,这是对 ComplexEntityID 工厂的依赖。
  • 对构建器的依赖是明确的(这是一件好事)。目前,您的依赖项隐藏在对静态方法的调用中。
  • 您可以在测试中替换构建器。

总的来说,这种方法提高了内聚性并减少了耦合。

需要注意的一个潜在陷阱是构建器通常具有内部状态(与典型服务不同)。因此,请确保配置依赖项注入(inject)容器,以便为每个解析请求创建一个新的构建器实例。

关于java - 使用构建器模式时防止静态注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com