Ich habe viele Theorien über Unterschiede zwischen Service-Schicht und Controller gelesen, und ich habe einige Fragen darüber, wie dies in der Praxis zu realisieren. Eine Antwort auf Service layer and controller: who takes care of what? sagt:Unterschied zwischen Service-Schicht und Controller in der Praxis
Ich versuche Controller zu beschränken, um Arbeit zu tun in Bezug auf die Validierung http Parameter, zu entscheiden, welche Service-Methode mit zu nennen, welche Parameter, , was in der Http oder Anfrage zu stellen, welche im Hinblick auf Redirect oder weiterleiten, oder ähnliche Web-bezogene Sachen.
Red Flags: Mein Controller-Architektur schlecht gehen könnte, wenn:
The Controller zu viele Anfragen an die Schicht Service macht. Der Controller führt eine Anzahl von Anforderungen an die Service-Schicht aus, die keine Daten zurückgeben. Der Controller stellt Anfragen an die Service-Schicht , ohne Argumente zu übergeben.
Im Moment habe ich eine Web-App mit Spring MVC entwickle, und ich habe ein solches Verfahren zum Speichern E-Mail-Benutzers geändert:
/**
* <p>If no errors exist, current password is right and new email is unique,
* updates user's email and redirects to {@link #profile(Principal)}
*/
@RequestMapping(value = "/saveEmail",method = RequestMethod.POST)
public ModelAndView saveEmail(
@Valid @ModelAttribute("changeEmailBean") ChangeEmailBean changeEmailBean,
BindingResult changeEmailResult,
Principal user,
HttpServletRequest request){
if(changeEmailResult.hasErrors()){
ModelAndView model = new ModelAndView("/client/editEmail");
return model;
}
final String oldEmail = user.getName();
Client client = (Client) clientService.getUserByEmail(oldEmail);
if(!clientService.isPasswordRight(changeEmailBean.getCurrentPassword(),
client.getPassword())){
ModelAndView model = new ModelAndView("/client/editEmail");
model.addObject("wrongPassword","Password doesn't match to real");
return model;
}
final String newEmail = changeEmailBean.getNewEmail();
if(clientService.isEmailChanged(oldEmail, newEmail)){
if(clientService.isEmailUnique(newEmail)){
clientService.editUserEmail(oldEmail, newEmail);
refreshUsername(newEmail);
ModelAndView profile = new ModelAndView("redirect:/client/profile");
return profile;
}else{
ModelAndView model = new ModelAndView("/client/editEmail");
model.addObject("email", oldEmail);
model.addObject("emailExists","Such email is registered in system already");
return model;
}
}
ModelAndView profile = new ModelAndView("redirect:/client/profile");
return profile;
}
Sie können sehen, dass ich viele Anfragen an den Dienst haben Schicht, und ich umleiten von Controller - das ist Geschäftslogik. Bitte zeigen Sie eine bessere Version dieser Methode.
Und ein weiteres Beispiel. Ich habe diese Methode, die Benutzer-Profile zurück:
/**
* Returns {@link ModelAndView} client's profile
* @param user - principal, from whom we get {@code Client}
* @throws UnsupportedEncodingException
*/
@RequestMapping(value = "/profile", method = RequestMethod.GET)
public ModelAndView profile(Principal user) throws UnsupportedEncodingException{
Client clientFromDB = (Client)clientService.getUserByEmail(user.getName());
ModelAndView model = new ModelAndView("/client/profile");
model.addObject("client", clientFromDB);
if(clientFromDB.getAvatar() != null){
model.addObject("image", convertAvaForRendering(clientFromDB.getAvatar()));
}
return model;
}
Methode convertAvaForRendering (clientFromDB.getAvatar()) in Superklasse dieser Controller gesetzt wird, ist es richtig Platzierung dieser Methode, oder er muss in Betrieb genommen werden Schicht??
Hilfe bitte, es ist wirklich wichtig für mich.
Sie sollten die "Der Controller macht zu viele Anfragen an die Service-Schicht vergessen. Der Controller macht eine Anzahl von Anfragen an die Service-Schicht, die keine Daten zurückgeben. Der Controller macht Anfragen an die Service-Schicht, ohne Argumente übergeben. " klingt wie * non-sense * zu mir –
"Bitte bessere Version dieser Methode zeigen?", versuchen codereview.stackexchange.com –