2017-01-30 9 views
1

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

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

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

Я хотел бы создать 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.

Любая помощь очень ценится

+0

Вы пытались исключить PrivateService из модуля и включить его в @Component, где вы используете эту услугу? – DDRamone

+0

В чем проблема с этим, кроме объявления сервиса? – raj

+0

@DDRamone Я не могу этого сделать, потому что я хочу, чтобы частные службы были введены, чтобы их можно было издеваться. Если я последую тому, что вы имели в виду, вы бы сделали в конструкторе 'PubliclyExportedService'' новый PrivateService() '. Я прав? – Linvi

ответ

0

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

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

    constructor(private _service: MyPrivateSrvice) { } 

} 

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

+0

Хорошая идея, я попробую это вы уверены, что '@ Injectable' decorator имеют свои собственные свойства' провайдеров'? Я задаю вопрос, поскольку я не пытаюсь создавать здесь '@ components', но' @ injectables' – Linvi

+0

@Linvi Если это не '@ Component', вы вынуждены добавить его в поставщиков модулей (но это делает его общедоступным для других компонентов). Другого способа я не думаю. Я попытаюсь найти обходное решение и обновить u – DDRamone