我正在创建一个由多个服务组成的模块。这些服务具有通用功能。我想坚持DRY,所以我创建了一个"基本"服务,并将其注册到模块中:
angular.module("ModuleA").service("BaseService", function () {...});
然后我可以在我的其他服务中使用它,比如:
angular.module("ModuleA").service("ChildService", function (BaseService) {...});
这很好。但是,我希望"基本"服务是该模块的私有/内部服务。我的应用程序显然依赖于这个模块,我不希望控制器等直接使用BaseService,因为它在ModuleA中注册了,所以他们可以这样做。
有没有一种方法可以与其他几个服务共享BaseService类中的功能,而不将其暴露给整个应用程序?
实现目标的一个选项是将$provide.provider
与module.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);
});