Во всех источниках, которые я нашел о чистой архитектуре, представлен аналогичный поток событий:
// 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.