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

Posted

技术标签:

【中文标题】如何在共享模块中定义覆盖服务【英文标题】:How to define override services in a shared module 【发布时间】:2018-03-13 19:22:13 【问题描述】:

我有一个共享模块,用 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();
  

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

entity = MyAppEntityService;

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

试图避免这种模式。有关上下文,请参阅上面我更新的问题。 我明白了。对于您遇到的情况,这是完全有效的模式。您甚至可以在虚拟实现中抛出错误。您可以使用装饰器修改现有服务,但由于它应该被完全替换,因此没有意义。

以上是关于如何在共享模块中定义覆盖服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Maven2 模块之间共享过滤器文件?

覆盖所有模块的Swift.print()或共享功能

如何在magento中禁用自定义模块

如何覆盖现有的 react-native 原生组件

如何在两个模块之间共享数据库模型?

如何覆盖 webview 的文本选择上下文菜单?