前后端终究是要完成合久必分分久必合的趋势。在前后端分离的前提下,后端的一些设计模式慢慢地向前端过渡。
依赖注入在java等后端语言的发展下慢慢在前端使用。
在java中di主要是将对象在容器中实例化。使用控制反转(ioc)。像在angular中,双向数据绑定根据对模型的监控进行实现。而依赖注入是将服务等实例化后注入到控制器中进行实现。
下面就讲一下angular实现di的主要过程。主要依靠js语言的灵活性。
var
// 假设已定义好某些Service 这里相当于一个容器,用于实例化对象。
services = { abc: 123, def: 456, ghi: 789 },
// 获取func的参数列表(依赖列表) 获取需要依赖的函数名(也就是所要需要使用的函数key值)
getFuncParams = function (func) {
var matches = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m);
if (matches && matches.length > 1)
return matches[1].replace(/\s+/, '').split(',');
return [];
},
// 根据参数列表(依赖列表)填充参数(依赖项) 根据需要的函数key值,获取对应的value值(函数的具体实现),并将这些函数放在数组里面,以便apply调用
setFuncParams = function (params) {
for (var i in params) {
params[i] = services[params[i]];
}
return params;
};
// 激活器 在对象中使用apply实现函数调用
function Activitor(func) {
var obj = {};
func.apply(obj, setFuncParams(getFuncParams(func)));
return obj;
}
// 定义新Service 相当于([abc, ghi] , Service(abc,ghi)) 在Service控制器中调用注入的abc、ghi实例服务。
function Service(abc, ghi) {
this.write = function () {
console.log(abc);
console.log(ghi);
}
}
// 实例化Service并调用方法
var service = Activitor(Service);
service.write();