2013-03-11 20 views
9

Für stark typisierte statische Sprachen wie Java sind IoC/DI-Frameworks/Toolkits von unschätzbarem Wert, um die komplexen Systeme zu entkoppeln und somit die Subkomponenteneinheit testbar und ihre Zusammensetzung fließend zu machen.Javascript IoC/DI-Frameworks

Die meisten von uns zitieren, dass Javascript als locker typisierte dynamische Sprache bereits die wesentlichen Vorteile von IoC/DI im Geiste bietet, während einige darauf bestehen, dass Abstraktion/Implementierung auf höherer Ebene vorhanden sein sollte.

Für die letztere, was sind diese gemeinsamen IoC/DI-Implementierungen in Javascript Realm?

Antwort

2

Bitte werfen Sie einen Blick in wire.js. Das ist meine Entscheidung und es funktioniert großartig.

Die wichtigsten Merkmale sind:

  • Einfach, Injektion deklarative Abhängigkeit
  • eine flexible, nicht-invasive Verbindung Infrastruktur
  • Application Lifecycle Management
  • Leistungsstarke Core Tools und Plugin-Architektur für die Integration beliebte Frameworks und bestehender Code.
  • Unterstützung für beide Browser und Server-Umgebungen

auch einige Alternativen überprüfen Sie bitte npm modules for DI

+0

Nur eine gute Option, wenn Sie eine Anwendung verwenden, die ist AMD kompatibel. – schlingel

+0

Aus den Beispielen habe ich auch den Eindruck, dass Sie Ihre Anwendung in den IoC schreiben müssen, was dem Zweck eines IoC widerspricht. I.e.Ihre Komponenten sind oder sollten unabhängig vom IoC sein. Z.B. In Java tun Sie dies, indem Sie POJOs definieren und dann einen IoC verwenden, um sie miteinander zu verbinden. – Luke

+1

Warum kein einfaches Beispiel auf der Hauptseite? Menschen, die nach DI-Frameworks suchen, kennen normalerweise die Vorteile, daher sollte das wichtigste ein einfaches Beispiel sein, wie man eine Abhängigkeit einbringt und ein Maß an Boilerplate-Code erfasst, um Frameworks schnell zu vergleichen. Das HelloWire-Beispiel ist einfach zu versteckt die Dokumentation: https://github.com/cujojs/wire/blob/master/docs/concepts.md – GameDeveloper

0

Angularjs eine Abhängigkeit Management-Implementierung bietet die IMO ist groß. Aber Angular ist viel mehr als nur ein DI-Container. Um davon zu profitieren, muss Ihre App von Grund auf eckig sein. Es ist jedoch einen Versuch wert, besonders wenn Sie starke formbasierte Interaktionen haben.

1

Javascript Duck-Typing ermöglicht es uns, Abhängigkeiten leicht zu mocksen.

Hier ist ein kleines Beispiel dafür, wie Sie dies tun könnte:

Wir haben eine einfache Funktion, die ein Element der Datenbank hinzugefügt werden darstellt. DB ist eine Abhängigkeit, die wir verspotten wollen.

function SaveItem(item){ 

    var db = new DB(); 

    db.insert(item); 

}; 

Wenn wir die DB-Abhängigkeit ändern, um ein Parameter zu sein, dann können wir injizieren, was wir wollen. Wenn die Funktion aufgerufen wird, prüft sie, ob der DataStore-Parameter existiert. Wenn das Element vorhanden ist, wird der Wert db zugewiesen. Wenn dataStore null oder nicht definiert ist, wird stattdessen ein neues DB-Objekt erstellt. Dies ermöglicht es Ihnen, Ihre Abhängigkeit mit der Gewissheit zu injizieren, dass db immer einen Wert hat.

function SaveItem(item, dataStore){ 

    var db = dataStore || new DB(); 

    db.insert(item); 

}; 

Jetzt können wir unsere Abhängigkeit wie so spotten:

function mockDb(){ 

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

}; 

Und sie alle zusammen in einem Test zu bringen:

function SaveItemShouldCallInsertOnDb = function(){ 

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

    SaveItem(someTestItem, testDb); 
}; 
+3

Irgendein Kommentar zur Abstimmung down? Das scheint eine ziemlich eigenartige Antwort auf die Abstimmung über ... – BentOnCoding

+0

Ja, warum der Downvote? – Harindaka

+4

Der ganze Vorteil von DI * frameworks * ist, dass Implementierungen auf der App- oder Test-Ebene und nicht innerhalb von Funktionen entschieden werden sollten. Wenn ich App A habe, die Service B anruft, ... der Service X benutzt. Wenn ich der Autor von X bin und ihn auf Service Z aktualisiere, sollte der Autor von App A * nicht dafür verantwortlich sein, Z downzuloaden App A -> B -> C ... -> X. Dies ist die Aufgabe eines DI-Frameworks wie Guice oder Spring. Es gibt äquivalente Frameworks für Javascript, die dies tun können, aber Ihr Beispiel zeigt nicht, wie es erreichbar ist. –

Verwandte Themen