我的 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 来实现此目的。这些方法是否有更好的替代方案或改进?
我个人不喜欢方法1:@Entity应该是一个保存状态和数据信息的类,而不是逻辑。
在方法 2 中,除了最终导致代码重复之外,我没有看到任何问题。 我建议使用构建器方法定义一个构建器类,您可以在其中注入 LinkGenerator 并在其中对逻辑进行分组。
第三种解决方案可能是修改 LinkGenerator 方法,以便它们接受的参数不是模型,而是您实际使用的两个字符串(名称和描述)。这样您就可以生成必要的值,然后将所有内容简单地传递到构造函数中。
干杯