Как определить внутренний сервис Angular и сделать его недоступным для использования вне модуля? - PullRequest
2 голосов
/ 18 октября 2019

Можно ли в любом случае предотвратить внедрение службы за пределы исходного модуля?

Скажем, что мы загружаем projects.module.ts лениво, а ProjectsModule импортирует ProjectsStoreModule. У меня есть служба, определенная в ProjectsStoreModule, которую я не хочу вводить в ProjectsModule, но это нормально, если ее вводить в любом месте внутри ProjectsStoreModule. Мне было интересно, есть ли способ достичь этого?

Примечание: ProjectsStoreModule не имеет компонентов, поэтому я не могу предоставить услугу компоненту. Служба, которую я хочу изолировать, будет добавлена ​​в эффект Ngrx, который является службой.

Что я сделал:

Я зарегистрировал ProjectsService:

@Injectable({
    providedIn: ProjectsStoreModule
})
export class ProjectsService {
    ...
}

ProjectsModule:

@NgModule({
    ...
})
export class ProjectsModule {
    ...
    imports: [ProjectsStoreModule] 
}

Этот подход, очевидно, вызвал столько Circular dependency предупреждений.

Затем я попытался зарегистрировать ProjectsService в @NgModule decorator:

@NgModule({
    ...
    providers: [ProjectsService]
})
export class ProjectsStoreModule {
    ...
}

Теперь проблема в том, что при импорте ProjectsStoreModule в ProjectsModule служба, которую я хотел сделать внутренней, будет доступна в ProjectsModule.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Не предоставляйте его, используйте массив провайдера модуля. Внедрить сервис в корневой компонент модуля, если он есть у модуля. Или просто предоставьте это в любом объявлении компонента, который внедряет сервис. Это сделает службу доступной только для компонента и его дочернего компонента.

@Component({
    selector: "component",
    templateUrl: "./component.component.html",
    providers: [
       InternalServiceClass
    ]
})```
2 голосов
/ 18 октября 2019

Да, есть способ предотвратить внедрение службы за пределы исходного модуля.

Сначала вам нужно создать модуль для вашей службы, т. Е. ProjectServiceModule

Позже, зарегистрируйтесьваш сервис с недавно созданным ProjectServiceModule, как показано ниже:

@Injectable({
    providedIn: ProjectsServiceModule
})
export class ProjectsService {
    ...
}

Теперь включите ProjectServiceModule в ваш NgModule:

@NgModule({
 imports :[ProjectServiceModule]
})
export class ProjectsStoreModule {
    ...
}

Это решение удалит ваши ошибки циклической зависимости при сборкеприложения, а также решить вашу проблему, так как этот модуль импортируется только в ProjectsStoreModule

См. эту ссылку для получения дополнительной информации

...