我的团队希望转向一种更接近 Angular 代码库 CommonJS/Node JS 语法的依赖注入(inject)样式:
var myDependency = require('myDependency');
我已经开始在函数顶部直接使用 $injector.get()
,到目前为止没有明显的问题。这意味着我已经转换了这个:
angular.module('modD', ['modA', 'modB', 'modC'])
.service('serviceD', ['serviceA', 'serviceB', 'serviceC', function(serviceA, serviceB, serviceC) {
//My code here
}])
进入:
angular.module('modD', ['modA', 'modB', 'modC'])
.service('serviceD', ['$injector', function($injector) {
var serviceA = $injector.get('serviceA');
var serviceB = $injector.get('serviceB');
var serviceC = $injector.get('serviceC');
//My code here
}]);
我有什么遗漏的吗?在函数定义之外声明所需的依赖项是否会导致任何性能问题?
最佳答案
注意:此答案尚未经过测试。 深入研究 Angular 代码后,我发现:
// in function createInjector
function provider(name, provider_) {
...
if (isFunction(provider_) || isArray(provider_)) {
provider_ = providerInjector.instantiate(provider_);
}
...
return providerCache[name + providerSuffix] = provider_;
}
...
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
...
// in function createInternalInjector
function invoke (...){
...
for (i = 0, length = $inject.length; i < length; i++) {
args.push(
locals && locals.hasOwnProperty(key)
? locals[key]
: getService(key, serviceName)
);
}
...
return fn.apply(self, args);
}
function instantiate(...){
...
var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null);
var returnedValue = invoke(Type, instance, locals, serviceName);
return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
}
...
return {
invoke: invoke,
instantiate: instantiate,
get: getService,
annotate: createInjector.$$annotate,
has: function(name) {
return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
}
};
它的调用看起来像:
服务
调用工厂
调用实例化
factory
已调用provider
已调用instantiate
所以我认为你的问题等于逐一调用 $injector.get() 与调用 $injector.instantiate() 一次具有相同的性能吗?
如代码所示,instantiate
调用了 invoke
,它实际上为您注入(inject)的每个服务调用了 getService
。 $injector.get
只是绑定(bind)到 getService
。
所以我的同等问题的答案是正确。
您的问题的答案是不,他们的表现非常接近。
如有错误,请指正,谢谢!
关于javascript - 使用 $injector.get() 获取 Angular 中的依赖项有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39059766/