直接使用$ injector实例与获取依赖关系作为参数

时间:2015-03-22 13:11:25

标签: javascript angularjs

在Angular中,从$ injector实例直接获取依赖项是一种好的做法,而不是作为参数吗?

我遇到的问题是我的控制器开始有很多依赖关系,而不是:

myApp.controller(['$scope', 'Dep1', 'Dep2', 'Dep3', function($scope, Dep1, Dep2, Dep3) {
    ...
}]);

我愿意:

myApp.controller(['$scope', '$injector', function($scope, $injector) {
    var Dep1 = $injector.get('Dep1');
    var Dep2 = $injector.get('Dep2');
    var Dep3 = $injector.get('Dep3');
}]);

我发现它的功能相同,但参数的混乱程度要小得多。我想这会使我的组件不太容易测试,对吧?

您怎么看?

2 个答案:

答案 0 :(得分:5)

根据我的意见并在阅读以下帖子后:

Post 1

Post 2

Angular's documentation on DI (Dependency Injection)

为了最小化长依赖列表,您的第二种方法被视为服务定位器反模式。 见 - Service locator AntiPattern

使用服务定位器反模式是不好的,因为会使您作为维护开发人员的生活变得更糟,因为您需要使用大量的脑力来掌握您所做的每项更改的含义。使用$ injector会混淆资源的实际依赖关系(在本例中为控制器)并且会导致可维护性。

此外,根据angular's documentation,最好的方法是:

  

使用内联数组注释(首选)

如果您的控制器最终使用了这么多依赖项,那么您可能做错了,也许您打破了Single responsibility principle。考虑:

  1. 将更多逻辑委托给注入
  2. 的服务
  3. 分成不同的控制器,因此每个只有(几乎)1个责任

答案 1 :(得分:0)

这取决于您编写代码的方式以及如何使您轻松编写代码。我总是以这种方式编写控制器希望它会有所帮助:}

var appCtrl = function($scope, others){...}
app.controller('appCtrl',['$scope', 'others', appCtrl]);