Ho un immutabile User
un'entità:Come evitare un modello anemico di dati? I repository possono essere iniettati in entità?
public class User {
final LocalDate lastPasswordChangeDate;
// final id, name, email, etc.
}
ho bisogno di aggiungere un metodo che restituisce informazioni se la password dell'utente deve essere cambiato I.D. non è stato modificato per oltre l'impostazione di sistema passwordValidIntervalInDays
.
L'approccio attuale:
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());
}
}
La domanda è come rendere il codice di cui sopra più orientato agli oggetti ed evitare il modello di dominio anemico antipattern? Se il metodo passwordMustBeChanged
essere spostato User
se così come accedere SettingsRepository
, dovrebbe essere iniettato nel costruttore User
s', o dovrebbe un'istanza Settings
essere fornita al ctor, o qualora il metodo passwordMustBeChanged
richiedere un'istanza Settings
da fornire?
Il codice di Settings
e SettingsRepository
non è importante, ma per completezza, eccolo:
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);
}
}
Ho letto http://stackoverflow.com/questions/5694241/ddd-the-rule-that-entities-cant-access-repositories-directly e http://stackoverflow.com/questions/827670/is-it-ok-per-entity-to-access-repository ma nessuno di loro sembra rispondere alla mia domanda –
Dai un'occhiata a [this] (https://blog.inf.ed.ac. uk/sapm/2014/02/04/the-anemic-domain-model-is-no-anti-pattern-its-a-solid-design /) –