Implementazione di un modello di strategia con iniezione di dipendenza

1

Ok, quindi l'obiettivo qui è implementare un modello di strategia che può essere testato utilizzando qualsiasi tipo di strumento di test automatizzato.

Sono stato alle prese con questo problema concettualmente da alcune settimane e voglio chiarirlo.

Quindi la configurazione corrente è simile a questa:

<?php
// CreateReportUseCase.php
class CreateReportUseCase
{
 protected $factory;
 public function __construct(Factory $factory)
 {
    $this->factory = $factory;
  }

  public function create($params)
  {
    // based on something in the params
    // ask the factory to give us one of the strategy classes

    // for this example, let's assume I'm going to execute
    // a different strategy based on the user role.
    // e.g. Admin
    $strategy = $this->factory->make($params['user_role']);

    // execute the strategy using the data out of the params
    $strategy->execute($params);
  }
}

// Factory.php
class Factory
{
  protected $admin_strategy;
  protected $user_strategy;
  public function __construct(AdminStrategy $admin_strategy, UserStrategy $user_strategy)
  {
    $this->admin_strategy = $admin_strategy;
    $this->user_strategy = $user_strategy;
  }

  public function make($role)
  {
    switch($role)
    {
       case 'Admin':
         return $this->admin_strategy;
         break;
       case 'User':
         return $this->user_strategy;
         break;
    }
  }
}

AdminStrategy implements RoleStrategy
{
  public function execute($params)
  {
    // it's not important what we do here.
    return json_encode($params);
  }
}

Questo ti sembra sano di mente? Come potrei migliorarlo? Per me, la fabbrica sembra un po 'imbarazzante dal momento che sta solo restituendo alcune dipendenze iniettate invece di istanziare una strategia.

    
posta Carvefx 15.04.2014 - 13:54
fonte

1 risposta

0

Alla fine, raccogliendo tutti i consigli nella sezione commenti, sono andato a fare della Fabbrica una Fabbrica attuale, fornendole un dizionario tra alcuni parametri come "Utente" e uno spazio dei nomi completo + nome della classe.

In questo modo la Factory non è accoppiata con le strategie effettive e in realtà costruisce istanze invece di limitarsi a restituire un attributo.

Come suggerito, la strategia scelta viene quindi inserita all'interno di una proprietà nella classe Context.

    
risposta data 21.04.2014 - 10:44
fonte

Leggi altre domande sui tag