inversifyjs - Marcos de IoC/DI de Javascript
node js dependency injection container (3)
Angular.js proporciona una implementación de administración de dependencias que es excelente IMO. Pero Angular es mucho más que solo un contenedor DI, por lo que para beneficiarse de él, su aplicación tendrá que ser angular desde cero. Sin embargo, vale la pena intentarlo, especialmente si tiene interacciones pesadas basadas en la forma.
Para lenguajes estáticos fuertemente tipados como Java, los frameworks / toolkits de IoC / DI son invaluables para desacoplar los sistemas complejos de modo que la unidad de subcomponentes se pueda probar y su composición sea fluida.
La mayoría de nosotros citamos que el Javascript como lenguaje dinámico tipado ya ofrece los principales beneficios de IoC / DI en espíritu, mientras que algunos insisten en que debe haber una mayor abstracción / implementación del nivel.
Para este último, ¿cuáles son esas implementaciones comunes de IoC / DI en el reino de Javascript?
JavaScript Duck-Typing nos permite simular fácilmente las dependencias.
Aquí hay un ejemplo rápido de cómo puedes hacer esto:
Tenemos una función simple que representa un elemento que se agrega a la base de datos. DB es una dependencia de la que querremos burlarnos.
function SaveItem(item){
var db = new DB();
db.insert(item);
};
Si cambiamos la dependencia DB para que sea un parámetro, entonces podemos inyectar lo que queramos. Cuando se llama a la función, comprueba si el parámetro dataStore existe. Cuando el artículo existe, el valor se asigna a db. Cuando dataStore es nulo o indefinido, se crea un nuevo objeto DB en su lugar. Esto le permite inyectar en su dependencia la confianza de que db siempre tendrá un valor.
function SaveItem(item, dataStore){
var db = dataStore || new DB();
db.insert(item);
};
Ahora podemos burlar nuestra dependencia así:
function mockDb(){
return{
insert: function(){
assert(true);
}
}
};
Y para juntar todo en una prueba:
function SaveItemShouldCallInsertOnDb = function(){
var testDb = new mockDb();
var someTestItem = { name: "test item" };
SaveItem(someTestItem, testDb);
};
Eche un vistazo a wire.js. Esta es mi elección y funciona genial.
Las principales características son:
- Inyección de dependencia declarativa simple
- Una infraestructura de conexión flexible y no invasiva
- Gestión del ciclo de vida de la aplicación
- Potentes herramientas básicas y arquitectura de complemento para integrar marcos populares y códigos existentes.
- Soporte para entornos de navegador y servidor
También verifique algunos módulos alternativos npm para DI