Come aggiungere funzionalità extra a una classe di metodo esistente dinamicamente con DI?

2

Sto cercando il modello migliore da applicare nel mio problema. Ho un'interfaccia che definisce la mia funzionalità della classe di servizio

interface NegotiationInterface {
    abstract public function resetNegotiation(Negotiation $negotiantion);
} 

Una classe principale lo implementa

public class NegotiationService implements NegotiationInterface {

    public function __construct(…Some Dependencies…)
    {
    ….        
    }

    public function resetNegotiation(Negotiation $negotiantion){
    …. //All business logic
    }
}

NegotiationService è registrato sotto il contenitore DI (basato su Symfony) e utilizzato in tutto il campo dall'identificativo del servizio.

$negotiationService = $this->container->get(“negotiation_service”);
$negotiationService->resetNegotiation($negotiation);

Tuttavia alcuni dei nostri clienti (la negoziazione contiene le informazioni sul cliente), richiedono un ulteriore passaggio dopo aver chiamato resetNegotiation, ad esempio la nostra logica di business comune + chiamando un webservice. Ho raggiunto lo schema del decoratore, ma non sono sicuro che sarebbe l'approccio migliore durante l'utilizzo di DI. In tal caso, come dovrei candidarmi insieme a DI. Mi piacerebbe avere questi passaggi aggiuntivi caricati dinamicamente in base al client.

    
posta dextervip 03.11.2017 - 17:51
fonte

1 risposta

2

Dovresti creare 2 classi di NegotiationService che implementino le due diverse funzionalità di resetNegotiation (). Quindi aggiungi una classe NegotiationServiceFactory che ti fornirà il Servizio corretto in base alle informazioni del cliente. Dovresti mantenere questa logica aziendale esplicita e non nasconderlo in alcuni aspetti tecnici.

Nel tuo codice chiamerai NegFactory dal contenitore DI e chiedigli di fornire il NegService corretto in base all'ID client (o ad altri parametri).

$negotiationServiceFactory = $this->container->get(“negotiation_service_factory”);
$negotiationService = $negotiationServiceFactory->getServiceByClientInfo($someClientInfo);
$negotiationService->resetNegotiation($negotiation);
    
risposta data 08.11.2017 - 00:36
fonte