Угловая шина 6 сообщений

В настоящее время наша команда разработала простое приложение angular 6 с несколькими компонентами, и они работают правильно, но мы знаем, что эти компоненты уже слишком связаны друг с другом (они слишком много знают о себе). Естественно, мы хотим перейти к разделению решений, таких как популярная шина событий / сообщений внутри приложения angular 6.

Таким образом, компоненты, вместо того, чтобы подписываться друг на друга, должны знать только о шине Messa Ge и заботиться только о том, что опубликовано в шине и подписано на нее.

Этот пример реализации основан на классе подписки, но в соответствии с интернет-решением лучше использовать BehaviorSubject.

Итак, у меня есть несколько вопросов:

  1. стоит ли менять Subscription -> BehaviorSubject?

    1. Лучше ли иметь список подписок вместо одного сейчас?
    2. Как установить начальное значение для подписки при подписке?
    3. Если я хочу избавиться от канала и хочу использовать что-то еще, например, пространство имен класса сообщений, то как его можно получить? Это хороший подход?

    import {Injectable} из '@angular/core'; import { Observable, Subject } из 'rxjs/Rx'; import { filter, map } из 'rxjs/operator';

    Интерфейс экспорта IClassConstructor { new (...args: any[]): T; }

    интерфейс экспорта IMessage {канал: функция; содержание: любое; } /** простая основанная на классах шина сообщений публикации / подписки для обеспечения разъединенной передачи событий, действий, команд * / @Injectable () export class MessageService {private message = new Subject ();

    public publish<T>(messageInstance: T): void {   // Flux/Redux: 'dispatch'
        const channel = messageInstance.constructor;
        this.message.next({'channel': channel, 'content': messageInstance}); // Redux: {'type': string, 'payload': any }
    }
    
    public subscribe<T>(messageClass: IClassConstructor<T>): Observable<T> {
        const channel: IClassConstructor<T> = messageClass;
        return this.message.pipe(
            filter((message: IMessage) => {
                return message.channel === channel;
            }),
            map((message: IMessage) => {
                return message.content;
            })
        );
    }
    

    }

0 ответов

Другие вопросы по тегам