Sto provando, come test, a creare Iniezione delle dipendenze da zero in JavaScript. Considera la seguente struttura di codice, che emette un avviso:
- Soddisfa i termini del principio di inversione delle dipendenze ?
- Tecnicamente è Iniezione delle Dipendenze?
- e in caso negativo, quali modifiche strutturali sono necessarie?
-
function App(name, services, clients) {
var that = this;
this.name = name;
this.services = services || {};
this.clients = clients || {};
this.Service = function (func) {
func();
}
this.Client = function () {
this.dependencies = {};
for (var i = 0; i < arguments.length; i++) {
if (that.services[arguments[i]]) {
this.dependencies[arguments[i]] = that.services[arguments[i]];
}
}
}
}
var fooBar = new App('fooBar');
fooBar.services.alert = new fooBar.Service(function() {
alert('Yep!');
});
fooBar.clients.alerter = new fooBar.Client('alert');
fooBar.clients.alerter.alert();
Uno degli aspetti strutturali di questa struttura di cui non sono sicuro è che nel codice precedente, il costruttore di client
conosce il codice per iniettare le dipendenze.
Wikipedia dice:
Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern. The client is not allowed to call the injector code.
Tuttavia, una risposta su questo sito che spiega la denominazione di dipendenze di iniezione di dipendenza il costruttore può iniettare la dipendenza:
Let's say you have some sort of "repository" class, and that repository is responsible for handing data to you from a data source.
The repository could establish a connection to the data source by itself. But what if it allowed you to pass in a connection to the data source through the repository's constructor?
Nota, quanto sopra è il codice accorciato (funzionante), ho omesso il codice coinvolto nella definizione dei servizi per rendere più semplice l'esempio del codice (omesso anche la gestione rigorosa degli errori in caso di una dipendenza mancante) - la struttura generale dovrebbe essere apparentemente corretto o errato - questo è l'obiettivo della domanda, non l'implementazione specifica.