Questa struttura soddisfa i termini del principio di Inversion of Control?

0

Sto provando, come test, a creare Iniezione delle dipendenze da zero in JavaScript. Considera la seguente struttura di codice, che emette un avviso:

-

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.

    
posta Viziionary 26.09.2015 - 13:04
fonte

1 risposta

2

Non sono abbastanza sicuro di cosa stia facendo il tuo codice, ma sono abbastanza sicuro che non sia qualcosa che riconoscerei come un'iniezione di dipendenza. Nello specifico, sembra che il tuo oggetto client sia responsabile della ricerca delle sue dipendenze da un repository centrale durante la costruzione (sebbene utilizzi un nome di dipendenza modificato come parametro costruttore), che mi sembra più vicino allo schema Locator di servizio di Dipendenza dell'iniezione.

    
risposta data 27.09.2015 - 17:39
fonte