我正在寻找已完成大量搜索的信息,但我只能找到与服务之间的命名空间冲突相关的答案/帖子或将一项服务注入另一项服务的方法。
假设我有两个单独的服务:
angular.module('app')
.service('OneService', function() {
this.func = function() {
console.log('service one');
};
})
.service('TwoService', function() {
this.func = function() {
console.log('service two');
};
});
我将它们注入工厂"命名空间":
angular.module('app')
.factory('namespace', function(OneService, TwoService) {
return {
OneService: OneService,
TwoService: TwoService
};
});
然后我可以有效地注入两个服务并按预期使用它们只有一个依赖项:
angular.module('app')
.controller('ctrl', function(namespace) {
namespace.OneService.func(); //=> 'service one'
namespace.TwoService.func(); //=> 'service two'
});
见工作Plunker。
此示例仅结合了两个服务,但可能是提供多个"实用程序"功能,而不必单独注入每个。
以这种方式注入依赖项是否有任何缺点(例如效率,性能),除了可能将功能暴露给组件/范围然后不使用?
答案 0 :(得分:0)
在这种情况下它们是相似的。性能上的差异是调用namespace
工厂函数。
单次注射这样做是不切实际的。 namespace
服务意味着需要额外的单元进行测试。
对于多次注射,它很容易成为反模式。如果所有的依赖项使用所有 namespace
依赖项,则可能应该通过继承来管理;所有控制器/服务都可以从父类继承。如果某些的依赖项使用某些 namespace
依赖项,那么它并不比全局变量更好,并且会遇到相同的设计问题。
AngularJS DI容器具有以下几个优点:
当已知其依赖项列表时,也很容易理解单元的工作方式。
所有这些好处都受到单个namespace
依赖项的影响。