56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
const { getFuncProps } = require('../utils');
|
|
const moduleMap = require('./DepMap');
|
|
|
|
class Provider {
|
|
constructor() {
|
|
this._cache = {};
|
|
this.init();
|
|
}
|
|
static getInstance() {
|
|
if (!Provider.instance) {
|
|
Provider.instance = new Provider();
|
|
}
|
|
return Provider.instance;
|
|
}
|
|
get cache() {
|
|
return this._cache;
|
|
}
|
|
init() {
|
|
this._cache = moduleMap;
|
|
}
|
|
regist(key, value) {
|
|
this._cache[key] = value;
|
|
}
|
|
loadDep (depName) {
|
|
const dep = moduleMap[depName];
|
|
if (dep) {
|
|
this._cache[depName] = require(dep);
|
|
}
|
|
}
|
|
inject(fn, scope = {}) {
|
|
const deps = getFuncProps(fn) || [];
|
|
for(let i = 0, len = deps.length; i < len; i++) {
|
|
const depName = deps[i];
|
|
const dep = this.cache[depName];
|
|
if(dep) {
|
|
deps[i] = dep;
|
|
} else {
|
|
throw new Error('Cannot find dependence');
|
|
}
|
|
}
|
|
return fn.apply(scope, deps);
|
|
}
|
|
getModule(depName) {
|
|
if (!this.cache[depName]) {
|
|
this.loadDep(depName);
|
|
}
|
|
return this.cache[depName] || {};
|
|
}
|
|
}
|
|
const provider = Provider.getInstance();
|
|
global.Provider = provider;
|
|
|
|
module.exports = {
|
|
inject: (...args) => provider.inject(...args),
|
|
regist: (...args) => provider.regist(...args),
|
|
}; |