首页 > 解决方案 > Clean Architecture 中的双向事件流

问题描述

在我发现的关于干净架构的所有来源中,都提供了类似的事件流:

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

但是对于应用程序,可能需要使用数据层生成的事件,例如 websocket/event sourcing/FCM/等。

所以如果我想实现这样一个远程事件源,我清楚地知道它属于数据层,它实际上是一个数据源。

但是,如果我有一个使用 http 的混合应用程序,并且在某些特殊情况下可以说 FCM,我如何区分我必须订阅的流数据源和 http 数据源。

例如,我有一个文件夹结构:

    - data
     - datasources
     - repositories
     - mappers
     ...

非常简化的 http 数据源和 repo 看起来像这样。

    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) {}
    }

所以我不明白:

如果存储库必须建立连接并订阅这样的数据源,则用例必须订阅存储库并查看订阅用例或存储库触发数据源事件回调的用例或什么?

也许该流数据源应该属于另一个层/以不同的名称命名,例如 Service/PushService/EventBus/类似的东西,以将其与通常的数据源区分开来?

我为我的英语和演讲道歉,我很难提出这样的问题。

一个很好的例子是一个聊天应用程序,其中一部分必须使用 websocket 进行消息传递,而另一部分则基于 http 进行身份验证/加载用户首选项/等。

标签: typescriptclean-architecture

解决方案


推荐阅读