2017-02-16 5 views
3

У меня есть две службы, оба являются @Injectable. ServiceA предоставляется компонентам через массив Providers и работает повсеместно. ServiceB является одноэлементным и находится в массиве Providers своего модуля и отлично работает повсюду. ServiceA не должен оставаться ничем, и ServiceB должен оставаться синглом.Устранение неисправностей в другом сервисе (singleton), Angular2

Моя проблема в том, что теперь мне нужно получить доступ к службе ServiceA из ServiceB, но не знаю, как получить к ней доступ. Кажется, я не могу вводить не-одиночную службу в одноэлементный.

Все, с чем я сталкиваюсь, говорит мне, что я должен поставить службу в bootstrap или декларации модуля, но, как я уже говорил, я не могу этого сделать, поскольку мне нужно, чтобы ServiceA вел себя как не одиночный.

// module setup 
... providers: [ServiceB] 

// non-singleton 
@Injectable() 
export class ServiceA 

// singleton 
@Injectable() 
export class ServiceB { 
    constructor(ServiceA) // <-- this is the problem area, need to get ServiceA here 

Я пытался делать что-то вроде конструктора (Inject (ServiceA) serviceA), но, кажется, получают те же ошибки, с тем

Error: DI Error No provider for ServiceA!

  1. Как я могу «обеспечить» не-одиночки услуги в однопользовательскую службу, где оба являются @Injectable?

ответ

4

Вы можете объявить ServiceA как в @Component.providers и @NgModule.providers:

  • При внутривенном введении ServiceA в конструктору компонента, вы получите компонент области действия экземпляра (соответствующий @Component.providers декларации).
  • При вводе ServiceA в конструктор другой службы (в вашем случае: при введении ServiceA в ServiceB) вы получите глобальный экземпляр (соответствующий объявлению @NgModule.providers).

Другими словами, если вы переобъявить службу в качестве компонента поставщиков (в @Component.providers), это будет «тень» экземпляр, который был объявлен во всем мире в @NgModule.providers.

СЛОВ ВНИМАНИЕ:

  • Если вы инъекционные ServiceA в ServiceB И ServiceC, то B и C будет получить тот же экземпляр А.
  • Как отметил Seaal в комментариях, организации кода в этот способ может не совпадать с лучшими практиками.
+0

Большое спасибо @AngularFrance, что делает трюк на данный момент. Я помню вашу осторожность и думал об этом, должен быть способ вокруг, хотя нет? Я думаю, что это может вызвать проблемы в будущем ... Теоретически вы должны иметь возможность вводить неселекты в одиночные игры, не вызывая никаких проблем, позор Angular2 не дает приятного пути. –

+0

Добро пожаловать. Другим способом устранения отмеченного ограничения может быть перестройка вашего кода. Я полагаю, вам нужно, чтобы ваша служба была не одиночной, потому что каждый экземпляр службы должен иметь разные состояния/данные. Возможно, вы можете позволить службе быть одноэлементным, а вручную - поддерживать реестр для нескольких состояний внутри службы. Просто задумываясь вслух, не уверен, что это применимо к вашей ситуации. – AngularChef

+0

Ввод неселектов в одноточечные пакеты является запахом кода. Вы можете использовать [Angular2 Injector] (https://angular.io/docs/ts/latest/api/core/index/Injector-class.html) напрямую (в идеале в пределах фабричного класса), если вы хотите создать разные экземпляры 'ServiceA' для нескольких других сервисов. – Seaal

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

  • Нет связанных вопросов^_^