使用 $injector.get() 在 Angular 中获取我的依赖项有什么缺点吗?
Is there any downside to using $injector.get() to get my dependencies in Angular?
我的团队希望转向一种更接近Angular代码库的CommonJS/Node JS语法的依赖注入风格:
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
}]);
我错过了什么吗? 不在函数定义之外声明所需的依赖项是否会导致任何类型的性能问题?
注意:此答案尚未经过测试。在深入研究了角度的代码后,我发现:
// 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);
}
};
它的调用似乎是:
-
service
调用factory
调用instantiate
-
factory
调用provider
调用instantiate
所以我认为你的问题等于 一个接一个地调用 $injector.get(( 与调用一次 $injector.instantiate(( 的性能相同吗?
如代码所示,instantiate
调用了invoke
,这些实际上为您注入的每个服务调用了getService
。而$injector.get
只是与getService
绑定.
所以我的平等问题的答案是真的。
您的问题的答案是否定的,它们的性能非常接近。
如果我错了,请纠正我,谢谢!
在服务的情况下,两段代码之间没有显着差异。 $injector.get(...)
调用不提供任何开销。但它为每个依赖项提供了大量额外的字符。
当使用具有本地依赖项的可注射对象(控制器和路由/状态解析器(执行相同的操作时,会有所不同。
当这些依赖关系
app.controller('SomeCtrl', function ($scope, service) { ... });
被替换为$injector.get(...)
,它会窒息$scope
- 它是本地依赖。随着其他依赖项的检索,控制器将失去其可测试性。不能用 模拟依赖项
$controller('SomeCtrl', { service: mockedService });
我个人看不出$injector.get(...)
如何有益于项目的风格(并且还没有看到一个好的风格指南来建议它(。
Node使用require
函数是因为它适合它,而不是因为它更好或更酷。另一种方法是将每个 Node 脚本打包到类似 AMD 的包装器中,这将是痛苦的。幸运的是,我们已经有了围绕 Angular 单元的包装器!
- 我的单元测试选项是什么
- 我的客户端选项是什么
- 我不知道为什么我的代码是错误的?又有什么错
- 我不知道我的编码有什么问题.(JavaScript)
- 我的自动完成并没有暗示什么
- 我的流星路线出了什么问题
- 什么正在取代我的'以及“;javascript代码中使用&#39;和&”;
- 我可以使用什么Javascript或Jquery库来处理带有IE8的GANTT图表
- 我的CSS/Javascript下拉菜单测试代码出了什么问题
- 不确定我在PHP AJAX中使用的是什么开发模式
- 什么能抵消我的工作压力
- 为什么't我的角度控制器'在其某个方法内的作用域中的依赖项
- 要求JS应用程序无法识别我的依赖项
- Javascript:我的画布什么也没画
- 将需要将我的依赖项范围限定为每个导入的文件
- 我应该把我的依赖连接到我的Javascript库上吗?
- 为什么webpack试图解析每个文件在我的依赖's路径
- 使用 $injector.get() 在 Angular 中获取我的依赖项有什么缺点吗?
- 如何根据我的依赖项确定我的节点应用支持的最小/最大节点版本
- 我有一个shopify商店,我想知道我的存货什么时候卖完了