javascript - 使用 $injector.get() 获取 Angular 中的依赖项有什么缺点吗?

标签 javascript angularjs dependency-injection

我的团队希望转向一种更接近 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/

相关文章:

javascript - Joi 验证器替代模式错误消息

javascript - 在数据表的渲染列中使用 ng-click

c# - 这个插件框架是 IoC/DI 吗?

ruby - 构造函数注入(inject)与 attr_writer

javascript - 将存储在文档属性中的数据返回到数组并推送到范围;气体

javascript - x轴和y轴溢出

javascript - Angular 自定义过滤器在处理某些匹配项时注销,但过滤掉所有结果

java - 使用 HK2 将 hibernate session 注入(inject) Jersey

javascript - JS正则表达式匹配字符串中的所有单词

javascript - Angular 模板中的 Concat 范围