Come determinare quale servizio chiamare

0

Ho modellato la mia applicazione utilizzando più oggetti di dominio "utente".

  • Candidato
  • Recruiter
  • Amministratore

Ogni entità si estende da un AbstractUser all'implementazione di UserInterface .

interface UserInterface
{
    public function getEmail();
    public function setEmail($email);
    public function getPassword();
    public function setPassword($password);
}

Hanno tutti un loro servizio CandidateService , AdminService etc che implementa UserServiceInterface

interface UserServiceInterface
{
   public function getUserByEmail();
}

Il mio problema sorge quando ho bisogno di recuperare un utente tramite il loro indirizzo e-mail (ad esempio PasswordResetService ). Non sono in grado di determinare quale servizio dovrei chiamare poiché l'e-mail potrebbe essere uno di questi. Sto anche utilizzando mongoDB, quindi non posso semplicemente eseguire una query nativa unendo le 'tabelle'.

Il mio attuale pensiero è che devo iniettare ogni servizio in PasswordResetService e chiamare getUserByEmail() su ciascuno di essi finché non ottengo l'utente desiderato.

class PasswordResetService
{
   public function getUserByEmail($email) 
   {
       $user = $this->userService->getUserByEmail($email);
       if ($user) return $user;

       $user = $this->recruiterService->getUserByEmail($email);
       if ($user) return $user;

       // etc ...
   } 
}

Da una prospettiva di progettazione, quanto sopra mi sembra un approccio inadeguato, come dovrei aggiungere un nuovo tipo di utente. Dovrei aggiornare anche il servizio di password.

C'è un modo migliore per raggiungere questo obiettivo?

    
posta AlexP 21.11.2014 - 12:44
fonte

1 risposta

1

Mi avvicinerei a questo con un UserService di primo livello a cui non interessa il tipo di utente con cui ha a che fare.

Se riceve una richiesta per un utente via email, può cercare sul database quale tipo di utente sia corretto e delegare la richiesta al servizio corretto. Questo potrebbe sembrare un po 'inefficiente, ma usato con un caching di query appropriato in seguito è in effetti soddisfacente.

Altri metodi che vengono passati a un oggetto utente potrebbero forse usare doppio invio per inoltrare il richiedere l'oggetto di servizio corretto., eliminando così la necessità di colpire il database per queste operazioni.

    
risposta data 21.11.2014 - 21:22
fonte

Leggi altre domande sui tag