2017-07-28 7 views
1

Ich verwende ngx-toastr Bibliothek zum Anzeigen von Benachrichtigungen. Diese Bibliothek enthält ToastrService. Aber ich möchte meinen eigenen Wrapper für diesen Dienst erstellen, da ich unterschiedliche Konfigurationen für verschiedene Arten von Nachrichten benötige. Also ich habe:Service-Injizieren zu einem anderen Dienst verhindern

@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); 
    } 
} 

ich von anderen Entwicklern verhindern wollen irgendwo ToastrService injizieren. Wenn der Benutzer ToastrService zu einer Komponente oder einem anderen Dienst außer NotificationService injiziert, möchte ich einen Fehler ausgeben. Wie kann ich das machen?

Modul:

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

Wie fügen Sie es zu Ihrer Anwendung hinzu? –

+0

Ich habe die Frage aktualisiert, ich habe Moduldefinition hinzugefügt, wenn ich Sie richtig verstanden habe. – user348173

Antwort

1

Wenn Benutzer ToastrService Komponente oder einem anderen Dienst außer von NotificationService injizieren möchte ich Fehler werfen.

Sie müssen das nicht tun. Lassen Sie sie alle den Dienst durch die übliche Token ToastrService konsumieren, sondern sie werden die Instanz des dekorierten NotificationService

Diese Bibliothek erklärt ToastrService auf Modulebene erhalten. Sie können diesen Dienst auf dem Stammkomponentenebene unter dem gleichen Grunde neu zu definieren:

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

Wenn eine Komponente, die ein Kind der Wurzel App Komponente Anfragen ist, dass sie Dienst wird die eingerichtete Version des Service.

Wenn Sie noch einen Fehler werfen wollen (obwohl ich glaube, dass dies nicht der Fall, wie die Dekoration der Fall ist), können Sie wie folgt tun:

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

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

Aber Sie haben @SkipSelf() Dekorateur auf dem NotificationService verwenden:

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

So erhalten Sie echte Klasseninstanz von der Modulinjektor. Und registrieren Sie nicht NotificationService auf dem Modul, nur auf der Root-Komponente.

+0

Das ist nicht, was ich eigentlich will. Ein Entwickler könnte ToastrService injizieren, ein anderer Entwickler könnte NotificationService .... ja, der NotificationService wird in beiden Fällen eingespielt .... aber im Code sieht es aus wie zwei verschiedene Dienste. Deshalb möchte ich Fehler explizit auswerfen, wenn Entwickler ToastrService verwendet – user348173

+0

@ user348173, aktualisierte die Antwort –

+0

Jetzt bekomme ich Ausnahme '' 'Kein Anbieter für ToastrService!' '' – user348173

Verwandte Themen