Skip to content

Commit ea19bba

Browse files
committed
Added dependency injection example
1 parent 016e7e5 commit ea19bba

File tree

10 files changed

+175
-0
lines changed

10 files changed

+175
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
## Описание
2+
3+
`framework.js` - небольшая часть фреймворка, необходимая для демонстрации DI
4+
`application.js` - компонент приложения, с которого начинается запуск кода
5+
внутри фреймворка, он зависит от `component2.js`, `component3.js` и от
6+
библиотек npm: "mkdirp" и "ncp", от глобального API `console` и глобальных
7+
функций работы с таймерами: `setTimeout` и `setInterval`
8+
`component1.js` - модуль, который зависит от библиотек ядра ноды "console" и
9+
"util" и от библиотеки "colors" из репозитория npm
10+
`component2.js` - модуль, который зависит от "util", "path" и от `component1.js`
11+
`component3.js` - модуль, который не имеет внешних зависимостей
12+
13+
## Запуск
14+
15+
До запуска нужно установить зависимости, они описаны в `package.json`,
16+
а установить их можно из командной строки набрав `npm install`.
17+
Из командной строки можно набрать `node ./framework.js` или `node framework`.
18+
19+
## Задания
20+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var application = {};
2+
module.exports = application;
3+
4+
application.main = function() {
5+
console.log('Application entry point');
6+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"description": "Example: Application with dependencies",
3+
"version": "1.0.0",
4+
"author": "Timur Shemsedinov",
5+
"api": [
6+
"component2",
7+
"component3",
8+
"mkdirp",
9+
"ncp",
10+
"console",
11+
"setTimeout",
12+
"setInterval"
13+
]
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
var moduleName = {};
2+
module.exports = moduleName;
3+
4+
var privateProperty = 'Privat variable value in Module1';
5+
6+
var privateFunction = function() {
7+
console.log('Output from private function of Module1');
8+
};
9+
10+
function localFunction() {
11+
console.log('Output from local function of Module1');
12+
};
13+
14+
moduleName.publicProperty = 'Public property value in Module1';
15+
16+
moduleName.publicFunction = function() {
17+
console.log('Output from public function of Module1');
18+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"description": "Example: Module1",
3+
"version": "1.0.0",
4+
"author": "Timur Shemsedinov",
5+
"api": [
6+
"console",
7+
"util",
8+
"colors"
9+
]
10+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
var moduleName = {};
2+
module.exports = moduleName;
3+
4+
var privateProperty = 'Privat variable value in Module2';
5+
6+
var privateFunction = function() {
7+
console.log('Output from private function of Module2');
8+
};
9+
10+
function localFunction() {
11+
console.log('Output from local function of Module2');
12+
};
13+
14+
moduleName.publicProperty = 'Public property value in Module2';
15+
16+
moduleName.publicFunction = function() {
17+
console.log('Output from public function of Module2');
18+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"description": "Example: Module2",
3+
"version": "1.0.0",
4+
"author": "Timur Shemsedinov",
5+
"api": [
6+
"util",
7+
"path",
8+
"component1"
9+
]
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"description": "Example: Module3",
3+
"version": "1.0.0",
4+
"author": "Timur Shemsedinov"
5+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Типы библиотек
2+
var libraries = {
3+
console: 'global',
4+
setTimeout: 'global',
5+
setInterval: 'global',
6+
fs: 'native',
7+
vm: 'native',
8+
path: 'native',
9+
util: 'native',
10+
ncp: 'module',
11+
colors: 'module',
12+
mkdirp: 'module',
13+
};
14+
15+
// Ссылки на метаданные загруженных библиотек
16+
var loaded = {};
17+
18+
// Ссылки на загруженные библиотеки
19+
var api = {};
20+
21+
// Загружаем два системных модуля и после них основное приложение
22+
['fs', 'vm', 'application'].forEach(loadLibrary);
23+
24+
// Функция загрузчик
25+
function loadLibrary(name, parent) {
26+
if (typeof(parent) !== 'object') parent = { name: 'framework' };
27+
console.log('Loading dependency: ' + name + ' into ' + parent.name);
28+
var mod = {};
29+
loaded[name] = mod;
30+
mod.name = name;
31+
mod.type = libraries[name];
32+
if (mod.type === 'global') {
33+
mod.interface = global[name];
34+
api[name] = mod.interface;
35+
} else if (mod.type === 'native' || mod.type === 'module') {
36+
mod.interface = require(name);
37+
api[name] = mod.interface;
38+
} else {
39+
mod.type = 'app';
40+
mod.context = { module: {} };
41+
mod.context.global = mod.context;
42+
mod.sandbox = api.vm.createContext(mod.context);
43+
mod.config = require('./' + name + '.json');
44+
mod.fileName = './' + name + '.js';
45+
api.fs.readFile(mod.fileName, function(err, src) {
46+
mod.script = api.vm.createScript(src, mod.fileName);
47+
mod.script.runInNewContext(mod.sandbox);
48+
mod.interface = mod.sandbox.exports;
49+
api[name] = mod.interface;
50+
if (mod.config.api) {
51+
mod.config.api.forEach(function(item) {
52+
loadLibrary(item, mod);
53+
});
54+
}
55+
});
56+
}
57+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "diExample",
3+
"version": "1.0.0",
4+
"private": true,
5+
"author": "Timur Shemsedinov <timur.shemsedinov@gmail.com>",
6+
"description": "Dependency Injection Example for Node.js",
7+
"main": "./framework.js",
8+
"dependencies": {
9+
"colors": "1.1.x",
10+
"mkdirp": "0.5.x",
11+
"ncp": "2.0.x"
12+
},
13+
"engines": {
14+
"node": ">=5"
15+
},
16+
"readmeFilename": "README.md"
17+
}

0 commit comments

Comments
 (0)