在不引用具体服务名称的情况下注入服务

时间:2014-12-26 21:16:46

标签: angularjs

我有一个localStorageService,其实现必须是通用的,这意味着它不能绑定到某个服务,如'customerServicer'或'productService'

localStorageService应该接受service / get注入的服务,该服务不是服务的文字字符串名称。

如果没有angularjs中的类型/接口,我怎么能这样做????

'use strict';
angular.module('myapp').service('localStorageService', function (localStorageService, customerService) {

    // impl generic caching functions which works for all CRUD services
});

2 个答案:

答案 0 :(得分:0)

你想要这样的东西:

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');
});

希望这有帮助!

答案 1 :(得分:0)

您可以使用具有返回实际实现的通用服务名称的工厂。

factory('localStorage', ['myLocalStorage', function(myLocalStorage) { return myLocalStorage} ]) 

因此,如果你想用其他东西替换myLocalStorage的实现,你只需要在这一个地方进行。

关于类型和接口。打字稿给你这些。

例如,您可以定义一个接口ITokenStorage,了解您希望如何存储令牌。然后,您可以传入$ sessionStorage,$ localStorage或$ cookieStorage作为实现该接口的类型,以轻松更改您希望存储令牌的方式。

这对Angular 1.x来说都是可行的。 TypeScript是opensource并使用Npm进行安装。 IDE和编辑器支持它。