Двунаправленный поток событий в чистой архитектуре - PullRequest
1 голос
/ 10 февраля 2020

Во всех источниках, которые я нашел о чистой архитектуре, представлен аналогичный поток событий:

// View (e.g. user clicked a button) => Domain (use case) -> Data (through repository to datasource) -> Server/Db/etc.

Но для приложения может потребоваться использование событий, генерируемых слоем данных, например, websocket / sourcing / FCM /etc.

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

Но если у меня есть гибридное приложение который использует http вместе с допустим, например, FCM для некоторых особых случаев, как я могу отличить источник данных потока, на который я должен подписаться, от источника данных http.

Например, у меня есть структура папок:

    - data
     - datasources
     - repositories
     - mappers
     ...

Очень упрощенный источник данных http и репо будут выглядеть так:

    export class PostsRemoteDataSource {
      public async getPostsList(){
        const result = await fetch(/*...*/)
        return result.json()
      }
    }
    // ....
    export class PostsRepository {
      constructor(
        private readonly localDataSource: PostsLocalDataSource,
        private readonly remoteDataSource: PostsRemoteDataSource){}

      public async getPosts(){
        // ...
        const remoteData = await this.remoteDataSource.getPostsList()
        // ...
      }
    }

И источник данных потока будет выглядеть так:

    class PostsRemoteDataSource extends EventListener {
      public connect(someCredentials:any){}
      public sendMessage(message:any){}
      public listen(listener: (data: IPostDTO) => void) {}
    }

Так что я не понимаю:

Если репозиторий должен установить sh соединение и подписаться на такой источник данных, чем usecase должен подписаться на репозиторий и просмотреть подписки на usecase или репозиторий запускает прецеденты обратный вызов события источника данных или что?

Может быть, этот источник потоковых данных должен принадлежать какому-то другому слою / названному по-другому, например Service / PushService / EventBus / что-то подобное, чтобы отличать его от обычного источника данных?

Я прошу прощения за мой английский sh и презентацию, мне довольно сложно сформулировать такой вопрос.

Хорошим примером будет приложение для чата, где часть его должна использовать websocket для обмена сообщениями и других часть основана на http для аутентификации / загрузки пользовательских настроек / et c.

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