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

Pre*_*hev 3 javascript angularjs

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

我有一个问题,我的控制器开始有很多依赖,所以而不是:

myApp.controller(['$scope', 'Dep1', 'Dep2', 'Dep3', function($scope, Dep1, Dep2, Dep3) {
    ...
}]);
Run Code Online (Sandbox Code Playgroud)

我会做:

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

我发现它的功能相同,但参数的混乱程度要小得多.我想这会让我的组件稍微不那么容易测试,对吧?

你怎么看?

Or *_*Guz 5

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

发布1

发布2

Angular关于DI(依赖注入)的文档

为了最小化长依赖性列表,您的第二种方法被视为服务定位器反模式.请参阅 - 服务定位器AntiPattern

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

另外,根据angular的文档,最好的方法是:

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

如果您的控制器最终使用了这么多依赖项,那么您可能做错了,也许您违反了单一责任原则.考虑:

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