Angularjs 在不引用具体服务名称的情况下插入服务
我有一个localStorageService,它的实现必须是泛型的,这意味着它不能绑定到特定的服务,如“customerServicer”或“productService” localStorageService应该接受一个服务/注入一个不是该服务的文本字符串名称的服务 如果没有angularjs中的类型/接口,我怎么做Angularjs 在不引用具体服务名称的情况下插入服务,angularjs,Angularjs,我有一个localStorageService,它的实现必须是泛型的,这意味着它不能绑定到特定的服务,如“customerServicer”或“productService” localStorageService应该接受一个服务/注入一个不是该服务的文本字符串名称的服务 如果没有angularjs中的类型/接口,我怎么做 'use strict'; angular.module('myapp').service('localStorageService', function (localSto
'use strict';
angular.module('myapp').service('localStorageService', function (localStorageService, customerService) {
// impl generic caching functions which works for all CRUD services
});
你想要这样的东西吗:
myAppModule.factory('genericService', ['$injector', function(injector) {
return {
get: function(serviceName) {
return $injector.get(serviceName);
}
};
}]);
现在在另一个位置,如控制器中:
myAppModule.controller('TestController', function($scope, genericService) {
// Use the generic service to get another service instance
var appService = genericService.get('appService');
});
希望这有帮助 您可以将工厂与返回实际实现的通用服务名称一起使用
factory('localStorage', ['myLocalStorage', function(myLocalStorage) { return myLocalStorage} ])
因此,如果您想用其他东西替换myLocalStorage的实现,您只需要在这一个地方进行
关于类型和接口。打字稿给你这些
例如,您可以定义一个接口ITokenStorage,说明您希望如何存储令牌。然后,您可以将$sessionStorage、$localStorage或$cookieStorage作为实现该接口的类型传入,以便轻松更改存储令牌的方式
这一切都可以通过角度1.x实现。TypeScript是开源的,使用Npm安装。IDE和编辑器支持它 抱歉被“具体的服务名称”弄糊涂了。是否询问如何将服务注入另一个服务?@Dom在函数参数中写入服务名称时,服务会自动注入。但我不想将自己绑定到服务名称。我想为我的所有服务编写一个通用的工作缓存服务。因此,我无法在注入参数中写入文字服务名称。您的问题似乎不清楚。您想要一个接受另一个服务名称并返回其实例的通用服务吗?您的意思是希望您的服务自动加载到所有其他服务中吗?@ShashankAgrawal我想要一个接受另一个服务的通用服务。但无法使用注入的服务名称,因为无法将泛型服务绑定到具体的服务名称以进行泛型工作。否;-)我不想让localStorageService具有多个实现—这会破坏泛型类的用途。我想让localStorageService使用泛型服务名称,这样每个服务都可以被注入@Elisa,通用服务名称的示例是什么?我给出的示例允许您在另一个名称下插入一个名称的服务?“这和你想要的不同吗?”马丁,我想你是对的。泛型可以是任何东西,但您总是需要知道要实现什么。@elisa,我自己不使用使用工厂返回另一个服务的模式,但我使用的模式是任何存储服务都可以实现的泛型Typescript接口。@Martin我不使用Typescript,也不打算学习它:-)