Question

J'ai une classe de contact qui contient un objet PortalAccount. Quand je veux créer un « portail compte » pour un contact, un compte est créé à distance sur une application de portail en utilisant du savon / axe et est peuplé et le contact est enregistré portalAccount du contact (base de données locale contient des informations sur le compte à distance, comme ID d'utilisateur et le nom d'utilisateur, etc.).

J'ai donc une classe de service PortalServiceImpl qui a des méthodes pour créer réellement un utilisateur sur un portail distant, étant donné une instance de contact.

Compte tenu de toutes ces informations, ma question est alors: si le PortalServiceImpl obtenir une instance d'un objet ContactDAO et réellement faire l'économie, ou si la classe PortalServiceImpl il suffit de créer l'utilisateur distant, modifier le passé dans l'objet de contact, et laissez le client est responsable de l'enregistrement?

Méthode 1:

class ServiceFacadeImpl {
  public void createPortalAccount(Contact contact) {
    // here the contact is implicitly saved
    this.portalService.createPortalAccount(contact);
  }
}

Méthode 2:

class ServiceFacadeImpl {
  public void createPortalAccount(Contact contact) {
    // here contact is implicitly modified
    this.portalService.createPortalAccount(contact);
    this.contactDAO.save(contact);
  }
}

Les deux méthodes se sentent mal pour moi. Méthode 1 se sent mal parce que le PortalService crée un utilisateur distant et enregistrer le contact avec la base de données (mais à travers une interface DAO). Méthode 2 se sent mal parce que je dois supposer que l'PortalService modifie le contact je lui passer.

J'ai aussi un sentiment que je ne vois pas d'autres trucs, comme potentiellement ne gère pas toujours les transactions.

(BTW, je l'ai déjà utilisé les deux méthodes, et ne veux pas continuer refactoring dans un cercle sans fin. Quelque chose semble tout simplement faux ici.)

Était-ce utile?

La solution

Êtes-vous sûr que c'est une bonne idée que vous avez des ID de contact localement et à distance? Il me semble mal, mais peut-être je ne sais pas votre domaine.

Dans ma demande tous les nouveaux contacts sont envoyés par le webservice au portail à distance et stockées. Alors, lorsque j'enregistre un nouveau contact sur place, il est envoyé à un portail distant et enregistré là-bas. Peut-être que vous avez besoin même?

Si les pensées ci-dessus sont inacceptables pour vous, alors je le ferais comme ceci:

class ServiceFacadeImpl {
  public void CreatePortalAccountAndSaveContact(Contact contact) {
    try
    {
      contact.portalAccount = this.portalService.createPortalAccount(contact);
      this.contactDAO.save(contact);
    }
    catch(...)
    {
      // do cleanup, for example do you need to delete account from remote 
      // portal if it couldn't be saved locally?
      // If yes, delete it from portal and set contact.portalAccount = null;
    }
  }
}

Certains peuvent dire que CreatePortalAccountAndSaveContact rompre le principe de responsabilité unique mais imo dans cette situation, il est tout à fait normal parce que je comprends, vous avez besoin de cette opération pour être atomique. Droit?

Vous pouvez ajouter l'indicateur booléen à la méthode, ce qui indique si vous souhaitez enregistrer le contact. Mais si vous avez besoin toujours d'enregistrer le contact avec PortalAccount directement après l'avoir obtenu à partir du portail à distance -. Puis booléen n'est pas nécessaire

PS. Pourquoi utilisez-vous « ce » mot-clé? Est-ce député portalService? Si oui, alors peut-être vous avez besoin de reconsidérer votre convention de nommage et le nom des membres privés avec le préfixe « _ » par exemple (je pense qu'il est le plus populaire), comme _portalService - alors il sera facile de comprendre que _portalService est membre privé. Désolé pour offtopic.

Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top