0.3.1 • Published 2 years ago
@tuana9a/nanioc v0.3.1
nanioc
tuana9a Nodejs Inversion of Control
A simple dependency injection for nodejs
Installing
Using npm:
npm install @tuana9a/nanioc
Basic Usage
const nanioc = require("@tuana9a/nanioc");
class Test1 {
test2;
}
class Test2 {
test3;
}
class Test3 {}
const ioc = new nanioc.IOCContainer();
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.addBean(Test3, "test3");
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
const test3 = ioc.getBean("test3").getInstance();
console.log(test1.test2 == test2); // true
console.log(test2.test3 == test3); // true
Ignore some props
const nanioc = require("@tuana9a/nanioc");
class Test1 {
static _ignoreDeps = ["test3"]; // must be static
test2;
test3;
}
class Test2 {
test1;
}
const ioc = new nanioc.IOCContainer();
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test1.test2 == test2); // true
console.log(test2.test1 == test1); // true
console.log(test1.test3); // undefined
or ignore all
class Test1 {
static _ignoreDeps = ["test3", "__all"];
test2;
test3;
}
class Test2 {
test1;
}
const ioc = new nanioc.IOCContainer();
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test2.test1 == test) // true;
console.log(test1.test3) // undefined;
console.log(test1.test2) // undefined;
Ignore missing beans exception
const nanioc = require("@tuana9a/nanioc");
class Test1 {
test2;
test3;
}
class Test2 {
test1;
}
const ioc = new nanioc.IOCContainer({ ignoreMissingBean: true });
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.di(); // warn bean not found "test3"
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test1.test2 == test2); // true
console.log(test1.test3); // undefined
Auto scan using global ioc
file test1.js
const { ioc } = require("@tuana9a/nanioc");
class Test1 {
test2;
}
ioc.addBean(Test1, "test1");
module.exports = Test1;
file test2.js
const { ioc } = require("@tuana9a/nanioc");
class Test2 {
test1;
}
ioc.addBean(Test2, "test2");
module.exports = Test2;
file main.js
const { ioc } = require("@tuana9a/nanioc");
// need auto scan because of lazy load of nodejs
ioc.autoScan(".", {
absolute: true,
fileNameFilter: (fileName) => fileName.match(/test\d\.js/),
dirNameFilter: (dirName) => dirName != "node_modules" && dirName != ".git",
});
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test1.test2 == test2); // true
console.log(test2.test1 == test1); // true
Inject getter and setter
getter
class Test1 {
test2;
}
class Test2 {
test1;
}
const ioc = new nanioc.IOCContainer({ getter: true });
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test1.test2 == test2); // true
console.log(test2.test1 == test1); // true
console.log(test1.getTest2() == test2); // true
console.log(test2.getTest1() == test1); // true
setter
class Test1 {
test2;
}
class Test2 {
test1;
}
const test3 = new Test2();
test3.test1 = "not-a-real-test1";
const ioc = new nanioc.IOCContainer({ setter: true });
ioc.addBean(Test1, "test1");
ioc.addBean(Test2, "test2");
ioc.di();
const test1 = ioc.getBean("test1").getInstance();
const test2 = ioc.getBean("test2").getInstance();
console.log(test1.test2 == test2); // true
console.log(test2.test1 == test1); // true
test1.setTest2(test3);
console.log(test1.test2.test1 == "not-a-real-test1"); // true