Модуль Angular2 с частным вложенным контекстом DI

Я знаю, что стратегия контекста DI по умолчанию Angular2 заключается в расширении контекста внедрения зависимостей в масштабе всего приложения. Но я бы хотел, чтобы некоторые Injectables не были доступны во всем мире.

Вот конкретный пример того, чего я пытаюсь достичь.

Вероятно, есть документ, объясняющий, как это сделать, но я не смог его найти.

Я хотел бы создать ServiceModule, который бы отличал общедоступные / экспортируемые услуги от частных.

@Injectable() export class PrivateService{} // Not available in AppModule
@Injectable() export class PubliclyExportedService{ // Available in AppModule
  constructor(private privateService: PrivateService) { }
}

// The imported module
@NgModule({
  exports: [PubliclyExportedService],
  declarations: [PubliclyExportedService],
  providers: [
    PubliclyExportedService,
    PrivateService
  ]
})
export class ServiceModule {}

// The main module
@NgModule({
  imports: [ServiceModule]
})
export class AppModule { }

Цель состоит в том, чтобы использовать внедрение зависимостей, чтобы PubliclyExportedService мог использовать PrivateService, но любой класс за пределами ServiceModule не смог бы внедрить PrivateService.

Любая помощь приветствуется


person Linvi    schedule 30.01.2017    source источник
comment
Вы пытались исключить PrivateService из модуля и включить его в сам @Component, где вы используете эту службу?   -  person DDRamone    schedule 30.01.2017
comment
В чем проблема, кроме объявления услуги?   -  person raj    schedule 30.01.2017
comment
@DDRamone Я не могу этого сделать, потому что хочу, чтобы частные сервисы были внедрены, чтобы их можно было высмеять. Если бы я понял, что вы имели в виду, вы бы сделали в конструкторе PubliclyExportedService a new PrivateService(). Я прав?   -  person Linvi    schedule 30.01.2017
comment
@raj Проблема в том, чтобы указать, что можно решить с помощью модуля. Здесь, когда каждая служба является частью основного контекста DI, вы больше не можете ограничивать доступ к своему модулю.   -  person Linvi    schedule 30.01.2017
comment
@Linvi Ваш вопрос заключается в том, чтобы указать эту службу как public или private. Я предложил способ сохранить сервисы private. В любом случае я должен внедрить их через конструктор как для private, так и для public сервисов. (Термин private здесь неверен, но вы угадаете, о чем я.   -  person DDRamone    schedule 30.01.2017
comment
кстати, вам не нужно добавлять PubliclyExportedService в exports. (angular.io/docs / ts / latest / api / core / index /)   -  person DDRamone    schedule 30.01.2017
comment
Я не думаю, что есть способ сделать это, поскольку вы хотели, чтобы это было внедрено в службы.   -  person raj    schedule 30.01.2017


Ответы (1)


Вы можете использовать своего private провайдера (Услугу) в каждом Компоненте, который использует эту услугу:

 @Component({
  ...
  providers: [
    MyPrivateService // <= Using provider into this class
  ]
})
export class FeatureComponent{

  constructor(private _service: MyPrivateSrvice) { }

}

Такой подход дает вам возможность не объявлять Сервис как провайдера в корневом или общем модуле.

person DDRamone    schedule 30.01.2017
comment
Хорошая идея, я попробую это сегодня вечером и дам вам отзыв. Вы уверены, что у декоратора @Injectable есть собственное свойство providers? Я задаю вопрос, поскольку я не пытаюсь создать здесь @components, а @injectables - person Linvi; 30.01.2017
comment
@Linvi Если это не @Component, вы вынуждены добавить его в поставщики модулей (но это делает его общедоступным для других компонентов). Думаю, другого выхода нет. Я постараюсь найти обходной путь и обновить вас - person DDRamone; 30.01.2017