我应该将发电机放在哪一层?

问题描述 投票:0回答:1

我的 Spring Boot 应用程序中有一个实体模型,其属性为

id
name
description
linkForOwner
linkForConsumer
。需要使用
linkForOwner
组件基于
linkForConsumer
name
属性生成
description
LinkGenerator
属性。

@Entity
class Model {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String description;
    private String linkForOwner;
    private String linkForConsumer;
    
    // Constructors, getters, and setters are omitted for brevity.
}

LinkGenerator
组件提供了为所有者和消费者生成链接的方法:

@Component
class LinkGenerator {
    public String generateLinkForOwner(Model model) {
        // Implementation to generate link for owner
        return "Generated Link";
    }

    public String generateLinkForConsumer(Model model) {
        // Implementation to generate link for consumer
        return "Generated Link";
    }
}

我正在考虑两种方法来生成和设置这些链接:

方法 1:将 LinkGenerator 注入实体

@Entity
class Model {
    // Attributes and constructors are omitted for brevity.

    private final LinkGenerator generator;

    public Model(Long id, String name, String description, LinkGenerator generator) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.generator = generator;
        this.linkForOwner = generator.generateLinkForOwner(this);
        this.linkForConsumer = generator.generateLinkForConsumer(this);
    }
}

方法二:在服务层生成并设置链接

// In ModelService class
Model model = modelRepository.save(new Model("name", "description"));
model.setLinkForOwner(linkGenerator.generateLinkForOwner(model));
model.setLinkForConsumer(linkGenerator.generateLinkForConsumer(model));
modelRepository.save(model);

我不确定是直接将 LinkGenerator 组件注入实体类还是利用 setter 来实现此目的。这些方法是否有更好的替代方案或改进?

java spring-boot code-organization
1个回答
0
投票

我个人不喜欢方法1:@Entity应该是一个保存状态和数据信息的类,而不是逻辑。

在方法 2 中,除了最终导致代码重复之外,我没有看到任何问题。 我建议使用构建器方法定义一个构建器类,您可以在其中注入 LinkGenerator 并在其中对逻辑进行分组。

第三种解决方案可能是修改 LinkGenerator 方法,以便它们接受的参数不是模型,而是您实际使用的两个字符串(名称和描述)。这样您就可以生成必要的值,然后将所有内容简单地传递到构造函数中。

干杯

© www.soinside.com 2019 - 2024. All rights reserved.