AngularJS服务继承



我正在创建一个由多个服务组成的模块。这些服务具有通用功能。我想坚持DRY,所以我创建了一个"基本"服务,并将其注册到模块中:

angular.module("ModuleA").service("BaseService", function () {...});

然后我可以在我的其他服务中使用它,比如:

angular.module("ModuleA").service("ChildService", function (BaseService) {...});

这很好。但是,我希望"基本"服务是该模块的私有/内部服务。我的应用程序显然依赖于这个模块,我不希望控制器等直接使用BaseService,因为它在ModuleA中注册了,所以他们可以这样做。

有没有一种方法可以与其他几个服务共享BaseService类中的功能,而不将其暴露给整个应用程序?

实现目标的一个选项是将$provide.providermodule.config一起使用。您应该通过$provide.provider而不是$provide.service注册services——因为$provide.service只是$provide.provider的语法糖,所以没有语义差异。如果有什么不清楚的地方,叫我一声。

DEMO 和方法的本质:

var servicesModule = angular.module('services',[]);
servicesModule.provider("serviceA", function(){
  var _BaseConstructor = null;
  return {
    setBaseConstructor : function(BaseConstructor){
      _BaseConstructor = BaseConstructor;
    },
    $get : function(){
      function ServiceA(){
        this.callA = function(){
          return "calling A";
        }    
      }
      ServiceA.prototype = new _BaseConstructor();
      return new ServiceA();
    }
  }
});
servicesModule.config( function (serviceAProvider){
  // this will be totally inaccessible from outside
  function Base(){
    this.callBase = function(){
      return "calling base";
    }  
  }
  serviceAProvider.setBaseConstructor(Base);
});

最新更新