2017-07-28 93 views
1

我使用ngx-toastr庫顯示通知。此庫包含ToastrService。但是,我想爲此服務創建自己的包裝,因爲我需要針對不同類型的消息使用不同的配置。所以我有:防止服務注入到其他服務

@Injectable() 
export class NotificationService { 
    constructor(private toastrService: ToastrService) { 
    } 

    public success(message: string, title?: string): void { 
    this.toastrService.success(message, title); 
    } 

    public error(message: string, title?: string): void { 
    let toastConfig = { 
     ... 
    }; 
    this.toastrService.error(message, title, toastConfig); 
    } 

    public info(message: string, title?: string): void { 
    let toastConfig = { 
     ... 
    }; 
    this.toastrService.info(message, title, toastConfig); 
    } 

    public warning(message: string, title?: string): void { 
    this.toastrService.warning(message, title); 
    } 
} 

我想阻止其他開發人員在某處注入ToastrService。如果用戶注入ToastrService到除NotificationService以外的組件或其他服務,我想拋出錯誤。我怎樣才能做到這一點?

模塊:

@NgModule({ 
    imports: [ 
    ToastrModule.forRoot(), 
    ], 
    declarations: [], 
    providers: [  
    NotificationService 
    ], 
    exports: [] 
}) 
+0

如何將它添加到您的應用程序? –

+0

我更新了問題,如果我正確理解了你的話,我已經添加了模塊定義。 – user348173

回答

1

如果用戶注入ToastrService到組件或其他服務,除了 NotificationService我想拋出的錯誤。

你不需要那樣做。讓他們都按照常規標記ToastrService使用服務,但他們將獲得裝飾的實例NotificationService

此庫在模塊級別上聲明ToastrService。您可以在同一個令牌下的根組件級別重新定義這個服務:

@Component({ 
    providers: [ 
     { provide: ToastrService, useClass: NotificationService} 
}) 
export class AppRootComponent {} 

當這是該服務將獲得服務的裝飾版的根應用程序組件請求的孩子的任何部件。

如果你仍然想拋出一個錯誤(雖然我相信這不是裝修是怎麼做),你可以這樣做:

class ToastrServiceThatThrows { 
    constructor() { throw new Error('I should not be instantiated') } 
} 

@Component({ 
    providers: [ 
     { NotificationService }, 
     { provide: ToastrService, useClass: ToastrServiceThatThrows } 
}) 
export class AppRootComponent {} 

但你必須使用@SkipSelf()裝飾上NotificationService

@Injectable() 
export class NotificationService { 
    constructor(@SkipSelf() private toastrService: ToastrService) { } 

這樣就可以從模塊注入器中獲得真實的類實例。並且不要在模塊上註冊NotificationService,只需在根組件上註冊。

+0

這不是我真正想要的。一個開發人員可以注入ToastrService,另一個開發人員可以使用NotificationService ....是的,NotificationService將在這兩種情況下注入....但在代碼中它看起來像兩個不同的服務。這就是爲什麼我想顯式拋出錯誤的原因,當開發人員使用ToastrService – user348173

+0

@ user348173,更新了答案 –

+0

現在,我得到異常'''沒有提供ToastrService!''' – user348173