2014-12-26 3 views
-1

У меня есть localStorageService, реализация которых должно быть общими, что означает, что он не должен быть привязан к определенной службе, как «customerServicer» или «ProductService»Внедрить услугу без ссылки на имени бетонных служб

localStorageService должен принимать service/get injected service, который не является буквальным именем строки службы.

Как я могу это сделать без наличия типов/интерфейсов в angularjs ... ???

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

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

Извините, запутавшись в «конкретном названии службы». Вы спрашиваете, как ввести услугу в другую службу? – Dom

+0

@Dom Служба автоматически вводится, когда вы пишете имя службы в параметрах функции. Но я не хочу привязываться к имени службы. Я хочу написать общий сервис кэширования, используемый для ВСЕХ моих сервисов. Таким образом, я не могу написать буквальное имя службы в параметрах инъекции. – Elisabeth

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

Надеется, что это помогает!

0

Вы можете использовать завод с общим именем службы, который возвращает фактическую реализацию.

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

Так что, если вы хотите поменять реализацию myLocalStorage с чем-то еще, что вам нужно сделать это в этом одном месте только.

О типах и интерфейсах. Машинопись дает вам это.

Так, например, вы можете определить интерфейс, ITokenStorage, того, как вы хотите хранить токен. Затем вы можете передать $ sessionStorage, $ localStorage или $ cookieStorage как тип, реализующий этот интерфейс, чтобы легко изменить, как вы хотите сохранить токен.

Это все можно использовать с угловым 1.x. ТипScript является открытым исходным кодом и устанавливается с помощью Npm. Поддержка IDE и редакторов.

+0

Нет нет нет ;-) Я не хочу, чтобы localStorageService с несколькими реализациями - это побеждало бы цель универсального класса. Я хочу, чтобы localStorageService работал с общим именем службы, чтобы каждый сервис можно вводить! – Elisabeth

+0

@Elisa, что является примером общего названия службы? В приведенном примере вы можете ввести службу под одним именем под другим именем? Разве это отличается от того, что вы хотите? – Martin

+0

@ Мартин Я так думаю, что ты прав. Generic может быть чем угодно, но вам всегда нужно знать, что вы хотите реализовать. – daremachine

Смежные вопросы