AngularJS通过单个可注射的方式公开多个服务

时间:2018-01-16 10:40:44

标签: angularjs

我正在寻找已完成大量搜索的信息,但我只能找到与服务之间的命名空间冲突相关的答案/帖子或将一项服务注入另一项服务的方法。

假设我有两个单独的服务:

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

此示例仅结合了两个服务,但可能是提供多个"实用程序"功能,而不必单独注入每个。

以这种方式注入依赖项是否有任何缺点(例如效率,性能),除了可能将功能暴露给组件/范围然后不使用?

1 个答案:

答案 0 :(得分:0)

在这种情况下它们是相似的。性能上的差异是调用namespace工厂函数。

单次注射这样做是不切实际的。 namespace服务意味着需要额外的单元进行测试。

对于多次注射,它很容易成为反模式。如果所有的依赖项使用所有 namespace依赖项,则可能应该通过继承来管理;所有控制器/服务都可以从父类继承。如果某些的依赖项使用某些 namespace依赖项,那么它并不比全局变量更好,并且会遇到相同的设计问题。

AngularJS DI容器具有以下几个优点:

  • 可测试性
  • lazy instantiation
  • 去耦

当已知其依赖项列表时,也很容易理解单元的工作方式。

所有这些好处都受到单个namespace依赖项的影响。