如何在共享模块中定义覆盖服务

时间:2017-10-02 17:07:28

标签: javascript angularjs module ecmascript-6

我有一个用AngularJS 1.6.5编写的共享模块。该模块将由多个应用程序使用。该模块在内部具有多个服务,必须由主机应用程序覆盖。这是为了处理不同REST端点的请求授权差异等问题,这些端点在不同的主机系统之间都是不同的。

我知道我可以先定义我的共享模块,然后在我的代码中定义相同名称的服务,但这感觉很脏。特别是当每个应用程序已经有这样的服务时,只有不同的名称。

有什么建议吗?

澄清:

因此,我的共享模块可能具有注入服务的控制器的指令



class MyDirectiveController {
  /*@ngInject*/
  constructor($element, entity) {
    this.$element = $element;
    this.entity = entity;
  }
  
  $onInit() {
    this.entity.get(this.id)
      .then((data) => this.dataSet = data);
  }
}




而且,在共享模块中,我会有一个虚拟服务:



class Entity {
  /*@ngInject*/
  constructor($q) {
    this.$q = $q;
  }
  
  get() {
    console.info('You must include your own override service for retrieving entity data');
    return this.$q.reject();
  }
}




然后以某种方式将我的父app应用程序作为覆盖传递给模块的实体服务:



entity = MyAppEntityService;




1 个答案:

答案 0 :(得分:0)

服务定义的顺序仅对配置阶段有意义。对于运行阶段,模块的层次结构很重要(除非在单个模块中存在多个相同服务的定义)。

考虑到共享模块具有foo服务,加载的模块将能够覆盖其服务:

angular.module('app', ['shared']).factory('foo', ...);