【问题标题】:Using $injector vs. direct DI in angularjs?在 angularjs 中使用 $injector 与直接 DI?
【发布时间】:2015-07-27 12:26:07
【问题描述】:

我没有看到直接注入我的依赖项与在 angularjs 中使用 $injector 的区别(或优点/缺点)。为什么我会选择其中一个?这是两者的示例。

angular
    .module("myApp")
    .factory("myService", [
        "$injector", function($injector) {

            var $http = $injector.get("$http");

            //used $injector to get $http, now get some data, etc.
        }
    ]);

angular
    .module("myApp")
    .factory("myService", [
        "$http", function($http) {

            //just use $http to get some data, etc.
        }
    ]);

【问题讨论】:

    标签: angularjs angularjs-injector


    【解决方案1】:

    在大多数情况下,第二种方法简单易读,并且可以正常工作,特别是如果您使用为您编写字符串值的预编译器,例如ng-annotate:

    angular.module("myApp")
        .factory("myService", /*@ngInject*/ function($http, $locale, $window) {
        });
    

    我认为你没有理由避免它。

    第一种方法,使用$injector 应保留用于特定情况,例如当注入过多(并且您现在不想重构)或在测试中的某些特定情况下。

    【讨论】:

    • 谢谢。您是否同意下面的@sma 示例 1 使单元测试更容易?
    • @BBauer42 我会说这句话太宽泛了 :) 我刚刚编写了一个相当大的应用程序,用 karma/jasmine 进行了测试,使用依赖注入(使用 inject(function(...)))没有问题。但是,有些情况下您需要$inject。例如,当可注入只是一个函数(而不是对象)并且您需要模拟它时。在 95% 的情况下,依赖注入可以正常工作并且更具可读性。
    【解决方案2】:

    它还使单元测试更容易使用第一个示例。您只需模拟注入并为您处理依赖项。对于第二个例子,有一些方法可以绕过它,但你只会让你的生活变得更加困难。

    【讨论】:

      【解决方案3】:

      两种解决方案都有效,但区别在于代码的可读性和可扩展性。

      使用第二种解决方案,您可以按工厂定义查看所有模块的依赖项。

      angular
          .module("myApp")
          .factory("myService", [
              "$myService", function($myService) {
      
              }
          ]);
      

      如果你注入一个完整的 $injector,你的依赖将会被修复。您将无法使用一致的 API 注入其他服务。

      angular
          .module("myApp")
          .factory("myService", [
              "$injector", function($injector) { 
                  var $myService = $injector.get("myService");
              }
          ]);
      

      总而言之,两种解决方案都有效,但使用第一种可能性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 2015-05-26
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多