contenitore DI con più istanze dello stesso oggetto

1

Sto cercando l'idea di creare un contenitore DI che possa memorizzare più istanze dello stesso oggetto. In genere, un contenitore DI deve memorizzare una singola istanza dell'oggetto o creare un nuovo oggetto ogni volta che viene richiesto. Ecco l'esempio su cui sto lavorando:

class Container {
    protected $store;

    public function get($alias) {
         if (isset($this -> store[$alias])) {
             return $this -> store[$alias]($this);
         }
    }

    public function bind($alias, Closure $obj) {
         $this -> store[$alias] = $obj;
    }
}

Tutto funziona bene, in questo caso:

$c = new Container();
$c -> bind('book', function() {
    return new Book();
});

$book = $c -> get('book');

Ora immagino di avere un "Catalogo" di classe, il cui comportamento è dettato dai parametri passati al suo costruttore:

class Catalog {
    protected $category;

    public function __construct($category) {
        $this -> category = $category;    
    }
}

Voglio solo una singola istanza di ogni categoria memorizzata nel contenitore. Sì, posso farlo facilmente

$c -> bind('catalog.magazines', function() {
    return new Catalog('magazines');
});

$c -> bind('catalog.books', function() {
    return new Catalog('books');
});

Ma le categorie possono essere create dinamicamente in fase di runtime e questo sembra un sacco di codice. C'è una soluzione conveniente per questo? Solo un'istanza di ciascun oggetto e può gestirli dinamicamente. O forse non è affatto DI?

    
posta Deniss Kozlovs 15.04.2015 - 07:38
fonte

1 risposta

1

But categories can be dynamically created at runtime, and this seems like a lot of code. Is there a convenient solution for this? Only one instance of each object and can handle them dynamically. Or maybe it's not DI at all?

Bene, se le categorie possono essere create dinamicamente, come intendi identificare e ottenere dal contenitore DI?

Penso che non dovresti inserire categorie / cataloghi / qualsiasi cosa nel contenitore se sono realmente creati in massa in fase di runtime in modo dinamico. Invece, potresti voler inserire CategoryCollection nel contenitore e aggiungere / query / rimuovere le raccolte da esso utilizzando qualsiasi criterio tu desideri.

Non è quello che vuoi?

    
risposta data 18.04.2015 - 15:22
fonte

Leggi altre domande sui tag