Ich habe einen Basiscontroller (Spring MVC), der Benutzerdaten für meine Website erhält. Es hat verschiedene Endpunkte, die Daten in verschiedenen Umgebungsdatenquellen suchen/hinzufügen/aktualisieren können. Mein Problem ist, dass ich abhängig von Konfigurationswerten nur eine Liste von Benutzerdaten aus bestimmten Umgebungen lesen und zurückgeben muss (neben anderen Funktionen, die in diesem Beitrag weggelassen wurden).Delegierung der Serviceklasse
Ich habe eine Basisschnittstelle eingerichtet, um Benutzerdetails abzurufen, und Implementierungen für jede Datenquelle, die ich ausführen muss.
public interface BaseUserService {
//user service interface
}
@Service
public class EnvironmentAService implements BaseUserService {
// do datasource specific dao stuff.
}
@Service
public class EnvironmentBService implements BaseUserService {
// do datasource specific dao stuff.
}
@Service
public class EnvironmentCService implements BaseUserService {
// do datasource specific dao stuff.
}
Zeit in meinem Controller ich so etwas wie dies tue:
@RestController
@RequestMapping("api")
public class UserController {
@Autowired
ConfigurationService configurationService
@Autowired
BaseUserService environmentAService;
@Autowired
BaseUserService environmentBService;
@Autowired
BaseUserService environmentCService;
@RequestMapping(value = "/users", method = RequestMethod.GET, headers={"Accept=application/json,application/xml"})
public List<User> userList(
@RequestParam(value="configValue") String configValue,
@RequestParam(value="username") String username,
@RequestParam(value="lastName") String configValue,
@RequestParam(value="dob") Date dateOfBirth
){
Configuration config = configurationService.getConfiguration(configValue);
if(config.value == null)
throw new ConfigurationNotFoundException("Please enter a valid configuration value");
List<User> userList = new ArrayList<User> users;
if(config.environments.contains(Environment.A))
userList.addAll(environmentAService.getUserList(username,configValue,dateOfBirth));
if(config.environments.contains(Environment.B))
userList.addAll(environmentBService.getUserList(username,configValue,dateOfBirth));
if(config.environments.contains(Environment.C))
userList.addAll(environmentCService.getUserList(username,configValue,dateOfBirth));
return userList;
}
}
Dies funktioniert gut, aber ich bin für eine elegantere Lösung suchen, so dass die Steuerung nicht so in den Dienst gebunden ist Klassen. Ich untersuchte das Muster von Delegierten und Dekorateuren, um vielleicht die Bedingungen in einer Klasse unterzubringen, aber diese scheinen nicht zu funktionieren, oder ich weiß nicht genau, wie ich das in meinem Fall umsetzen soll.
Fügen Sie eine Factory hinzu, die den angeforderten Typ von Dienstinstanzen basierend auf den konfigurierten Umgebungen zurückgibt. Durchlaufen Sie die zurückgegebenen Instanzen, um die Benutzerliste zu erstellen. – dbugger