2013-03-11 21 views
9

Per i linguaggi statici fortemente tipizzati come Java, i framework/toolkit IoC/DI hanno un valore inestimabile per separare i sistemi complessi, rendendo così verificabili l'unità dei sottocomponenti e la loro composizione.Strutture JavaScript IoC/DI

Molti di noi citano che Javascript come linguaggio dinamico digitato generosamente offre già i principali vantaggi di IoC/DI nello spirito, mentre alcuni insistono sul fatto che occorra implementare un'astrazione/implementazione di livello superiore.

Per quest'ultimo, quali sono le implementazioni IoC/DI comuni nel regno Javascript?

risposta

2

Si prega di dare un'occhiata in wire.js. Questa è la mia scelta e funziona benissimo.

Le caratteristiche principali sono:

  • iniezione semplice, dipendenza dichiarativa
  • A, un'infrastruttura flessibile connessione non invasiva
  • Application Lifecycle Management
  • strumenti di base potenti e architettura a plugin per integrare framework popolari e codice esistente.
  • supporto per entrambi i browser e server ambienti

Inoltre si prega di verificare alcune alternative npm modules for DI

+0

Solo una buona opzione se si utilizza un'applicazione che è Compatibile AMD. – schlingel

+0

Dagli esempi ho anche l'impressione che tu debba scrivere la tua applicazione nell'IoC, il che è un po 'come sfidare lo scopo di un IoC. Cioèi tuoi componenti sono, o dovrebbero essere, indipendenti dall'IoC. Per esempio. in Java lo fai definendo POJO e poi usa un IoC per collegarli insieme. – Luke

+1

Perché non un semplice esempio sulla pagina principale? le persone che cercano i framework DI di solito conoscono già i vantaggi, quindi la cosa più preziosa dovrebbe essere un semplice esempio su come iniettare una dipendenza e ottenere una misura della misura del codice boilerplate per confrontare rapidamente i framework. L'esempio HelloWire è troppo nascosto la documentazione: https://github.com/cujojs/wire/blob/master/docs/concepts.md – GameDeveloper

0

Angular.js fornisce un'implementazione gestione delle dipendenze che è grande IMO. Ma Angular è molto più di un semplice contenitore DI, quindi per trarne vantaggio la tua app dovrà essere angolare da zero. Vale la pena provare, soprattutto se si hanno interazioni pesanti basate su moduli.

1

La digitazione anatra di Javascript ci consente di risolvere facilmente le dipendenze.

Ecco un breve esempio di come si possa fare ciò:

Abbiamo una semplice funzione che rappresenta un elemento che viene aggiunto al database. DB è una dipendenza che vorremmo prendere in giro.

function SaveItem(item){ 

    var db = new DB(); 

    db.insert(item); 

}; 

Se si modifica la dipendenza DB come parametro, è possibile iniettare tutto ciò che si desidera. Quando viene chiamata la funzione, verifica se il parametro dataStore esiste. Quando l'elemento esiste, il valore è assegnato a db. Quando dataStore è nullo o indefinito, viene invece creato un nuovo oggetto DB. Questo ti permette di iniettare nella tua dipendenza con la certezza che db avrà sempre un valore.

function SaveItem(item, dataStore){ 

    var db = dataStore || new DB(); 

    db.insert(item); 

}; 

Ora siamo in grado di prendere in giro la nostra dipendenza in questo modo:

function mockDb(){ 

    return{ 
     insert: function(){ 
      assert(true); 
     } 
    } 

}; 

E per portare tutti insieme in un test:

function SaveItemShouldCallInsertOnDb = function(){ 

    var testDb = new mockDb(); 
    var someTestItem = { name: "test item" }; 

    SaveItem(someTestItem, testDb); 
}; 
+3

Qualche commento sul voto negativo? Sembra una risposta piuttosto singolare al voto negativo su ... – BentOnCoding

+0

Sì, perché il downvote? – Harindaka

+4

L'intero vantaggio dei DI * framework * è che le implementazioni dovrebbero essere decise a livello di app o test e non all'interno delle funzioni. Se ho l'app A, che chiama il servizio B, ... che utilizza il servizio X. Quindi se sono l'autore di X e lo aggiorno per richiedere il servizio Z, l'autore dell'App A dovrebbe * non * essere responsabile per il threading di Z giù App A -> B -> C ... -> X. Questo è il lavoro di un framework DI come Guice o Spring. Esistono framework equivalenti per javascript che possono farlo, ma il tuo esempio non dimostra come sia possibile. –