在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');
}]);
我发现它的功能相同,但参数的混乱程度要小得多。我想这会使我的组件不太容易测试,对吧?
您怎么看?
答案 0 :(得分:5)
根据我的意见并在阅读以下帖子后:
Angular's documentation on DI (Dependency Injection)
为了最小化长依赖列表,您的第二种方法被视为服务定位器反模式。 见 - Service locator AntiPattern
使用服务定位器反模式是不好的,因为会使您作为维护开发人员的生活变得更糟,因为您需要使用大量的脑力来掌握您所做的每项更改的含义。使用$ injector会混淆资源的实际依赖关系(在本例中为控制器)并且会导致可维护性。
此外,根据angular's documentation,最好的方法是:
使用内联数组注释(首选)
如果您的控制器最终使用了这么多依赖项,那么您可能做错了,也许您打破了Single responsibility principle。考虑:
答案 1 :(得分:0)
这取决于您编写代码的方式以及如何使您轻松编写代码。我总是以这种方式编写控制器希望它会有所帮助:}
var appCtrl = function($scope, others){...}
app.controller('appCtrl',['$scope', 'others', appCtrl]);