2017-01-30 67 views
1

我知道Angular2默认DI上下文策略是丰富应用程序范围的依赖注入上下文。但我希望Injectables不能在全球范围内使用。带有私有嵌套DI的Angular2模块上下文

下面是我尝试实现的具体示例。

有可能是一个文档解释如何做,但我一直没能找到它。

我想创建一个ServiceModule来区分Public/Exported服务和Private服务。

@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可以使用PrivateServiceServiceModule以外的任何类将不能够注射PrivateService的。

任何帮助是极大的赞赏

+0

您是否试图从Module中排除PrivateService并将其包含到您使用该服务的@Component本身中? – DDRamone

+0

这是什么问题,除了声明服务? – raj

+0

@DDRamone我无法做到这一点,因为我想要注入私人服务,以便他们可以被嘲笑。如果我遵循你的意思,你会在PubliclyExportedService构造函数中完成一个新的PrivateService()。我对么? – Linvi

回答

0

您可以使用private提供商(服务)为您的每一个组件,正在使用该服务:

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

    constructor(private _service: MyPrivateSrvice) { } 

} 

这种方法给你不申报服务的能力提供者加入你的根模块或共享模块。

+0

好主意,我会试试这个并且给你一些反馈,你确定'@ Injectable'装饰器有它们自己的'providers'属性吗?我在问这个问题,因为我不是在这里创建'@ components',而是'@ injectables' – Linvi

+0

@Linvi如果它不是'@ Component',那么你不得不将它添加到Module提供程序中(但是这会让其他组件公开),我没有其他办法了,我会尝试找到解决办法并更新你 – DDRamone