Stiamo appena iniziando a fare uno sforzo concertato per utilizzare l'iniezione di dipendenza in modo uniforme nel nostro progetto e ho riscontrato un problema.Iniezione di dipendenze PHP quando gli argomenti per il costruttore non sono disponibili
Sto scrivendo una classe per gestire le query di MongoDB. Passo in MongoClient come dipendenza dal costruttore, senza problemi. Ma come gestisco una dipendenza quando la variabile necessaria per istanziare l'oggetto non è disponibile al momento dell'istanziazione?
In particolare, abbiamo un wrapper per il metodo MongoCollection, findOne, che, se passi una stringa, attualmente (nel vecchio codice) trasforma quella stringa in un MongoId con "new MongoId ($ _id)", e lo usa per la funzione di ricerca.
Da quello che ho imparato sull'iniezione delle dipendenze, avere "nuovo MongoId" è una cattiva idea, e so già che renderà più difficile scrivere casi di test per la funzione che converte una stringa in un MongoId.
Ma come gestisco l'iniezione, quando la classe MongoId prende la stringa id sul costruttore?
L'unica cosa che ho pensato che avrebbe funzionato è quello di passare una chiusura sul costruttore di classe che fa qualcosa di simile:
$getMongoId = function($id){
return new MongoId($id);
};
con
class MyMongo
{
function __construct(MongoClient $client, Closure $mongoIdGetter){...}
}
[modificato per risolvere questo problema ultima parte]
Ma è questo il modo giusto per gestirlo? Certamente, se stiamo usando un DiC, possiamo farlo, ma richiedere una chiusura per il costruttore sembra un po 'troppo. Sono semplicemente troppo dogmatico per aver iniettato le mie dipendenze? Potrei sistemarlo facilmente usando "new MongoId ($ _id)" nella nuova classe, suppongo.
Grazie - il costrutto $ __ era solo una scoreggia cerebrale, fissata sopra. Penso che in parte hai letto male la mia domanda perché quando dico "gestire" sopra, non mi riferisco alla gestione degli errori, ma solo al senso generale del termine. – Karptonite
@Karptonite Oh ok, quindi puoi chiarire il motivo per cui vuoi inserire il setter MongoId nel costrutto, capisco la dipendenza ma non sarà necessario finché non utilizzerai effettivamente una funzione 'find'. Intendo per il test dell'unità tutto ciò che serve è controllare la risposta della funzione pubblica che restituisce un documento che dovrebbe esistere mentre si introduce una stringa per '_id', non si dovrebbe estendere il test dell'unità al driver MongoDB stesso – Sammaye
Quindi Sono nuovo all'iniezione di dipendenza, ma la mia comprensione era che usare una funzione come quella che hai scritto, con "new MongoId" nel codice, era generalmente una cattiva idea - ad esempio, se usavo metodi di MongoId nel mio codice, non potevo prenderlo in giro per assicurarmi che il mio codice chiamasse correttamente quei metodi. Ammetto che non è qualcosa che sto facendo ora. – Karptonite