【问题标题】:Pull to refresh in Domain Driven Design app在领域驱动设计应用程序中拉动以刷新
【发布时间】:2020-12-03 23:27:18
【问题描述】:

我需要在 iOS 应用程序中实现拉取刷新,我遇到了这个问题,我不知道如何使用 DDD 的最佳实践来解决问题。

表示层有一个刷新列表的事件,这需要更新结果丢弃缓存并从后端获取元素。

在域层中,我的用例与存储库通信,但是,由于缓存是一个实现细节,存储库接口没有公开“cleanCache”方法,因此没有从用例刷新缓存的干净方法. 这或多或少是我拥有的文件结构

  • GetAllTodosUseCase
  • TodosRepository(接口)

基础设施

  • InMemoryTodosRepository(缓存)
  • RemoteTodosRepository (api)
  • InMemoryWithRemoteTodosRepository(组合缓存和 api)

应用

  • 工厂

演示文稿

  • UI(与交互界面对话)

【问题讨论】:

    标签: domain-driven-design pull-to-refresh clean-architecture cache-invalidation


    【解决方案1】:

    由于它似乎是特定于用例的,何时可以使用缓存以及何时需要获取远程资源,所以使用哪个存储库最适合应用程序层的决定。

    例如,您可以使用工厂,它在运行时为应用程序用例提供具体的存储库实现,但仅在编译时仍依赖于存储库接口。

    或者您使用相同的方法创建另一个存储库接口,并将此存储库接口显式绑定到应该使用缓存的具体用例。

    【讨论】:

    • 嗯.. 我认为这里有 2 个用例可能是正确的.. 因为它们实际上是 2 个不同的用例,一个是获取 Todos,另一个是刷新 todos 里面用例,它们可能都调用相同的存储库方法,唯一的区别是应用层决定在这些不同的用例上注入哪个存储库。
    【解决方案2】:

    UI 调用执行用例的控制器。控制器负责识别用户交互并将其转换为对用例的适当调用。因此,控制器必须识别拉动刷新并创建一个新用例并将其传递给“未缓存”存储库。

    您的控制器代码应该包含类似这样的内容

     TodosRepository repository;
    
     if(isPullToRefresh()){
        repository = getRemoteTodosRepository(); 
     } else {
        repository = getInMemoryTodosRepository();
     }
    
     GetAllTodosUseCase usecase = new GetAllTodosUseCase(repository);
     
     List<???> todos = usecase.getTodos();
    

    【讨论】:

    • 我不认为在用例中有那些 if 案例,也没有表示层有什么意义。我认为有 2 个用例,一个用于获取所有用例,另一个用于刷新可能更有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多