gpt4 book ai didi

java - 如何避免贫血数据模型?存储库可以注入(inject)实体吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:30 25 4
gpt4 key购买 nike

我有一个不可变的 User 实体:

public class User {
final LocalDate lastPasswordChangeDate;
// final id, name, email, etc.
}

我需要添加一个方法,如果必须更改用户密码 i.d.,它将返回信息。它没有更改超过 passwordValidIntervalInDays 系统设置。

目前的做法:

public class UserPasswordService {
private SettingsRepository settingsRepository;

@Inject
public UserPasswordService(SettingsRepository settingsRepository) {
this.settingsRepository = settingsRepository;
}

public boolean passwordMustBeChanged(User user) {
return user.lastPasswordChangeDate.plusDays(
settingsRepository.get().passwordValidIntervalInDays
).isBefore(LocalDate.now());
}
}

问题是如何使上述代码更加面向对象并避免贫血领域模型反模式?是否应将 passwordMustBeChanged 方法移至 User 如果是,如何访问 SettingsRepository,是否应将其注入(inject) User' s 的构造函数,还是应该向构造函数提供 Settings 实例,或者 passwordMustBeChanged 方法是否需要提供 Settings 实例?

SettingsSettingsRepository的代码并不重要,但为了完整起见,这里是:

public class Settings {
int passwordValidIntervalInDays;
public Settings(int passwordValidIntervalInDays) {
this.passwordValidIntervalInDays = passwordValidIntervalInDays;
}
}

public class SettingsRepository {
public Settings get() {
// load the settings from the persistent storage
return new Settings(10);
}
}

最佳答案

对于系统范围的密码过期策略,只要您的 UserPasswordService 是域服务,而不是应用程序服务,您的方法还不错。在 User 中嵌入密码过期策略会违反 SRP 恕我直言,这也好不了多少。

您还可以考虑类似的事情(使用正确的设置初始化工厂):

PasswordExpirationPolicy policy = passwordExpirationPolicyFactory().createDefault();
boolean mustChangePassword = user.passwordMustBeChanged(policy);


//class User
public boolean passwordMustBeChanged(PasswordExpirationPolicy policy) {
return policy.hasExpired(currentDate, this.lastPasswordChangeDate);
}

如果最终可以为单个用户指定策略,那么您可以简单地将策略对象存储在 User 上。

您还可以在您当前的设计中使用 ISP,并在您的 UserPasswordService 服务上实现一个 PasswordExpirationPolicy 接口(interface)。这将使您可以在以后灵活地重构为真实的策略对象,而无需更改 User 与策略的交互方式。

如果您有一个 Password 值对象,您还可以通过使用类似的东西(密码创建日期将嵌入密码 VO 中)来使事情稍微更有凝聚力:

//class User
public boolean passwordMustBeChanged(PasswordExpirationPolicy policy) {
return this.password.hasExpired(policy);
}

关于java - 如何避免贫血数据模型?存储库可以注入(inject)实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800507/

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