Domain driven design 在域驱动设计应用程序中拉入刷新

Domain driven design 在域驱动设计应用程序中拉入刷新,domain-driven-design,pull-to-refresh,clean-architecture,cache-invalidation,Domain Driven Design,Pull To Refresh,Clean Architecture,Cache Invalidation,我需要在iOS应用程序中实现pull-to-refresh,我遇到了这个问题,我不知道如何用DDD的最佳实践来解决这个问题 表示层有一个事件来刷新列表,这需要更新结果,丢弃缓存并从后端获取元素 在域层,我的用例与存储库对话,但是,由于缓存是一个实现细节,存储库接口不公开“cleanCache”方法,因此没有从用例刷新缓存的干净方法。 这或多或少是我的文件结构 领域 GetAllTodosUseCase TodosRepository(接口) 基础设施 InMemoryTodosReposi

我需要在iOS应用程序中实现pull-to-refresh,我遇到了这个问题,我不知道如何用DDD的最佳实践来解决这个问题

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

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

领域

  • GetAllTodosUseCase
  • TodosRepository(接口)
基础设施

  • InMemoryTodosRepository(缓存)
  • RemoteTodosRepository(api)
  • InMemoryWithRemoteTodosRepository(由缓存和api组成)
应用

  • 工厂
介绍

  • UI(与交互接口对话)

因为在可以使用缓存和需要获取远程资源时,它似乎是特定于用例的,所以使用哪个存储库最适合应用层

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


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

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

控制器代码应该包含如下内容

 TodosRepository repository;

 if(isPullToRefresh()){
    repository = getRemoteTodosRepository(); 
 } else {
    repository = getInMemoryTodosRepository();
 }

 GetAllTodosUseCase usecase = new GetAllTodosUseCase(repository);
 
 List<???> todos = usecase.getTodos();
todos存储库;
if(isPullToRefresh()){
repository=getRemoteTodosRepository();
}否则{
repository=getInMemoryTosRepository();
}
GetAllToDouseCase usecase=新的GetAllToDouseCase(存储库);
List todos=usecase.getTodos();

Hm。。我认为这里有两个用例可能是正确的。。因为它们实际上是两个不同的用例,一个是获取TODO,另一个是刷新该用例中的TODO,它们可能都调用相同的存储库方法,唯一的区别是应用层决定在这些不同的用例上注入哪个存储库。我认为在用例中包含这些if用例和表示层没有多大意义。我认为有两个用例,一个用于获取全部,另一个用于刷新,这样会更有意义