2009-09-15 11 views
15

Ci sono inversioni di framework di controllo per javascript?Esistono inversioni di framework di controllo per javascript?

La risposta più vicina disponibile su StackOverflow che ho trovato è qui: What is the right way to wire together 2 javascript objects?. Sembra un ottimo inizio, ma ho pensato che avrei potuto trovare qualcosa con una storia di sviluppo più lunga.

Ho usato solo il castello Windsor da solo, e mi manca davvero nel web-client land.

+0

Si può solo avere le funzioni rinominati in un file diverso, perché avete bisogno di un quadro? –

+0

C'è molto di più. In JasFac (vedi la mia risposta) non ho nemmeno iniziato a grattare la superficie di ciò che può/dovrebbe essere fatto. È un grande argomento. JavaScript di solito tende a utilizzare i modelli di stile Localizzatore di servizi, ignorando totalmente IoC –

+0

Un paio di risposte provengono da persone che amano IoC ma che in realtà non hanno utilizzato la loro soluzione. Sarei curioso di sapere come hanno tenuto i loro oggetti disaccoppiati. Utilizzando un localizzatore di servizi? –

risposta

4

Ho iniziato a scriverne uno che non sono mai riuscito a completare. Non sono sicuro se lo farò mai come l'overhead probabilmente non ne vale la pena. se siete interessati, è a: http://code.google.com/p/jasproject/wiki/JasFac (che è la parte di CIO, la suite completa è a http://code.google.com/p/jasproject/)

La biblioteca beffardo è abbastanza completo (senza aspettative, però, in questo momento mi basta usare affermazioni sulle Mocks/stub) ma manca il quadro di test unitario. La porzione IoC è abbastanza completa ma potrebbe avere alcuni bug (non pensateci)

Sentitevi liberi di usarlo e/o contribuire, posso aiutare dove serve.

EDIT: più l'utilizzo può essere visto nei test unitari per jasfac: https://jasproject.googlecode.com/svn/trunk/Jas.Tests/JasFacTests.js

+1

Puoi approfondire perché non ne hai avuto bisogno? –

+0

Bene, come ho detto nell'altro commento, la maggior parte delle persone utilizza i locatori di servizi per questo tipo di necessità in JS. Inoltre, la dimensione del tuo JS è davvero importante, quindi, a meno che tu non stia realizzando un client molto realistico, devi ridurre al massimo la dimensione e il calcolo del codice. Vedi http://video.yahoo.com/watch/1041101/3881103 –

4

ero alla ricerca di uno l'anno scorso e sono imbattuto in squirrel-ioc. C'era qualcosa che non mi piaceva a riguardo - penso che supportasse solo istanze di stile singleton.

Squirrel è un contenitore CIO implementato in JavaScript per promuovere un migliore utilizzo delle architetture e modelli in basati sul browser Javascript applicazioni

ho iniziato a scrivere il mio, ma ho abbastanza lontano (costruttore e setter iniezione, valori e relazioni di riferimento, supporto singleton, test JsUnit) ma mai veramente necessari nella mia applicazione. Potrei dover controllare il progetto di Luke. Per riferimento, ecco un esempio del formato di configurazione con cui ho finito.

var iocConfig = { 
    "a" : { Type : A }, 
    "b1" : { Type : B, Props : [{Name : 'Letter', Ref : "a"}] }, 
    "b2" : { Type : B, Props : [{Name : 'Letter', Val : "a"}] }, 
    "c2" : { Type : C, Args : [{Ref : "a"}, {Val : "a"}] }, 
    "d" : { Type : D, Props : [{Name : 'Letter', Ref : "a"}] }, 
    "date" : { Type : Date, Props : [{Name : 'FullYear', Val : 2008}, {Name : 'Month', Val : 0}, {Name : 'Date', Val : 1}] }, 
    "array3" : { Type : Array, Args : [{Val : 3}] }, 
    "number1" : { Type : Number, Args : [{Val : 1}] }, 
    "string1" : { Type : String, Args : [{Val : "1"}] }, 
    "s-true" : { Type : S, Singleton : true}, 
    "s-false" : { Type : S, Singleton : false} 
}; 
+0

Sì, non ero nemmeno un fan dello scoiattolo, quindi scrivo il mio. Ho avuto la stessa cosa - l'ho iniziato ma non ne avevo davvero bisogno, quindi non ho mai finito. Dai uno sguardo alla mia fonte, in particolare i test unitari, c'è molto di più che puoi fare con esso rispetto alle modalità del sito. –

+4

Puoi spiegare perché non ne hai avuto bisogno? –

0

In linguaggi dinamicamente tipizzati come JavaScript e Ruby, DI non è poi così utile.

Il vantaggio principale di DI in linguaggi tipizzati staticamente come Java è in fase di test, per sostituire l'implementazione reale di alcune classi con una simulazione. Questo perché le classi Java sono immutabili e non è possibile sostituirle facilmente con i mock: è necessario un intero sistema DI per ottenerlo.

Ma in JavaScript è possibile sostituire facilmente le classi/metodi esistenti con quelli falsificati. Quindi, DI non è veramente necessario per raggiungere la testabilità.

Ovviamente ci sono altri scenari in cui DI potrebbe essere utile, ma non hai davvero indicato cosa vuoi usare per il DI, quindi ho trattato il caso più ovvio.

+6

Penso che DI sia diverso da IoC. Sì DI è facile in Javascript, dato che puoi scrivere dove vuoi, sto usando DI al momento per il test delle unità. Sebbene DI sia molto più semplice in Javascript, penso che IoC possa ancora avere vantaggi nel documentare le dipendenze e nel rendere il codice di test più pulito. Proprio ora quando provo qualcosa devo verificare manualmente che ogni dipendenza sia stata sostituita correttamente. Con IoC puoi vedere chiaramente quali dipendenze esistono e con che cosa sono state sostituite. –

+0

Buon punto Frank. –

+2

Sono di passaggio, quindi non ho tempo per cercare un riferimento, ma DI non è solo per testare (non è nemmeno il vantaggio principale). –

0

Io uso uno, qui è semplice codice da specifiche (è CoffeeScript):

di.register 'a', -> 'component a' 
di.get('a').should be: 'component a' 

Ci sono anche callback, ambiti diversi (applicazione, esempio, personalizzati), capacità di assegnare in modo esplicito i componenti .

DI: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib/dependency_injection.coffee

Spec: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib_spec/dependency_injection_spec.coffee

Io lo uso per assemblare applicazioni Backbone.js, ci sono un sacco di oggetti (App, Menu, Privacy, ...) ed è fare il mio la vita più facile.

WARN: Io lo uso internamente con oggetti nativi modificati, quindi potrebbero esserci degli errori :) Per favore fatemi sapere, probabilmente lo aggiusterò in un giorno o due (inviando tramite la pagina dei problemi https://github.com/alexeypetrushin/rad_core/issues).

P.S. Non mi piace il termine IoC è troppo ampio, DI è una definizione molto più esatta.

0

Si potrebbe guardare questa semplice libreria: fcjs È molto piccola ma può essere potente nel disaccoppiare il codice. È ispirato al framework Swiz AS3

0

Un'altra opzione (più recente) è requireJS (http://requirejs.org/).

+9

Non nuovo, non IoC –

+1

Sì, diverso tipo di gestione delle dipendenze :) – jamiebarrow

+1

IoC mette davvero in evidenza la pedantics. È un'opzione valida. –

-1

Prova infusione. È un framework IoC JS piuttosto potente. E 'utilizzato da due centri di ricerca nelle università di Toronto e Berkeley Infusion

pagina GitHub del progetto con ulteriori informazioni possono essere trovate qui Infusion GitHub pages

1

Scopri invertito http://philmander.github.com/inverted/, una caratteristica imballato Javascript CIO contenitore ho creato . Funziona su AMD nel browser e funziona anche con Node.

Utilizzato insieme a AMD, Invertito utilizza un file di configurazione separato per esprimere il modo in cui le classi vengono istanziate e il modo in cui interagiscono. Una volta definiti questi valori predefiniti e le relazioni, è possibile creare un contesto di applicazione e utilizzare le istanze delle classi.

http://dailyjs.com/2013/01/04/controldeck-xlsx-inverted/

0

Prova canDI.È una semplice libreria di dipendenze e di creazione di oggetti. È possibile creare singoletti, istanze e variabili che vengono automaticamente registrati alla creazione.

https://github.com/bflemi3/canDI

Problemi correlati