在干净架构数据源中处理插件和包依赖关系的方法?

问题描述 投票:0回答:1

我正在探索干净的架构,并在许多文章和视频中注意到它们将包/插件传递到数据源。例如,使用 SharedPreferences 作为本地数据源,使用 http 作为远程数据源。所以,我有几个问题:

  1. 如果我们需要将 SharedPreferences 和 HTTP 替换为其他的怎么办? 未来的插件和软件包?我们是否必须重构所有 数据来源?
  2. 我们有什么理由不应该将这些包包装在包装类中以使它们可重用吗?例如,如果我们使用带有特定标头的 http.client,则需要在每个数据源类中编写大量相同的代码。
  3. 有什么方法可以改变数据源中使用的插件和包而不需要 触及数据源类中现有的逻辑和数据映射?因为如果我们改变包,那么返回的数据类型也可能会改变,这就需要我们进行相应的重构。

您能否提供如何解决这个问题的建议?

示例 - 使用 http.client 的数据源类

class NumberTriviaRemoteDataSourceImpl implements NumberTriviaRemoteDataSource {
  final http.Client client; 

  NumberTriviaRemoteDataSourceImpl({@required this.client});


  Future<NumberTriviaModel> _getTriviaFromUrl(String url) async {
    final response = await client.get(
      url,
      headers: {
        'Content-Type': 'application/json',
      },
    );

    if (response.statusCode == 200) {
      return NumberTriviaModel.fromJson(json.decode(response.body));
    } else {
      throw ServerException();
    }
  }
}
flutter clean-architecture
1个回答
0
投票
  1. 处理此问题的推荐方法是使用抽象。高层模块不应该依赖于低层模块。两者都应该依赖于抽象。因此,如果稍后需要更改包/插件,您只需创建这些抽象类的新实现,而无需触及数据源类中的现有逻辑。

  2. 使用上述概念,如果您跨多个数据源使用具有特定标头的 HTTP,则创建包装类可以集中标头逻辑并简化数据源类。

  3. 学习依赖注入,无需修改现有逻辑即可轻松换出。

© www.soinside.com 2019 - 2024. All rights reserved.