2010-04-15 6 views
2

Je dois travailler avec du code qui n'est pas vraiment MVC (c'est-à-dire qu'il n'utilise pas un framework explicite entre autres choses). À l'heure actuelle, nous faisons avec des servlets qui transmettent des données aux services.Implémentation MVC/question sur les meilleures pratiques

Voici mon problème. Je reçois un message à une servlet qui contient tout un tas de données d'adresses que je dois enregistrer dans la base de données. Les données sont (évidemment) dans l'objet HttpServletRequest. Ma question est, comment puis-je transmettre ces données dans un service? Je suis réticent à le faire comme ceci:

AddressService.saveAddress(request); 

Parce que je ne pense pas que le service devrait avoir une dépendance à la demande. Mon autre option est de faire quelque chose comme ceci:

String addressLine = request.getParameter("addressLine"); 
.. 
.. about 7 other parameters 
.. 
String zip = request.getParameter("zip"); 

AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip); 

Mais je n'aime pas avoir une fonction avec un grand nombre de paramètres non plus. Je pensais faire un objet intermédiaire appelé AddressData qui contiendrait des données de la demande, et ensuite passer cela dans le service. Est-ce une façon acceptable de faire les choses?

Répondre

2

Oui, c'est un moyen connu d'éliminer cette dépendance. Je ne peux pas me souvenir des sources exactes du haut de ma tête, mais plusieurs livres incluent cette technique. Une variante de ceci serait de faire AddressData un wrapper qui, au lieu de copier et de conserver en lui-même toutes les données de requête nécessaires, garde juste une référence privée et lui transmet tous les appels. Cela peut être plus flexible et plus propre, surtout s'il y a beaucoup de paramètres de requête et/ou que les paramètres sont changés/de nouveaux sont fréquemment introduits.

1

Utiliser les interfaces pour découpler:

Modèle:

public interface Address { 
    String getLine1(); 
    String getLine2(); 
    ... 
    String getZip(); 
} 
public class AddressBase implements Address { 
    public AddressBase(String line1, String line2, ..., String zip) { 
     ... 
    } 
    ... 
} 
public class AddressService { 
    void saveAddress(Address address); 
} 

Maintenant, le contrôleur (s) comporte les options et le modèle est protégé de la mise en œuvre du contrôleur:

Controller Option 1:

// wrap - lazy interrogator 
class AddressRequestWrapper implements Address { 
    ... 
    AddressRequestWrapper(HttpRequest request) { 
     this.request = request; 
    } 
    String getLine1() { return request.get(LINE_1_FIELD_ID); } 
    ... 
} 

Contrôleur Option 2:

// "wrap" - eager interrogator 
class AddressRequestWrapper extends AddressBase { 
    AddressRequestWrapper(HttpRequest request) { 
     super(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
     ); 
    } 
    ... 
} 

Controller Option 3:

// Just use AddressBase directly 
Address address = 
    new AddressBase(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
    ); 
AddressService.saveAddress(address);