代码之家  ›  专栏  ›  技术社区  ›  Alexa289

在存储库模式中,将逻辑放在哪里来决定是从远程还是从本地获取数据?

  •  0
  • Alexa289  · 技术社区  · 4 年前

    我想在我的Flatter应用程序上实现存储库模式。

    假设我创建了一个界面来获取如下图书列表

    abstract class BookRepository {
    
       Future<List<Book>> getBookList();
    
    }
    

    我想在主页上显示图书列表。如果有internet连接,则从远程检索数据(使用Dio),否则从本地存储获取数据(使用Hive)

    因此,我创建了两个实现上述接口的类。

    第一个用于远程存储库

    class BookRemoteRepository implements BookRepository {
    
        @override
        Future<List<Book>> getBookList() async {
    
            List<Book> booksFromServer = await dio.get();  // Using Dio
            return booksFromServer;
        }
    
    }
    

    第二个是本地存储库

    class BookLocalRepository implements BookRepository {
    
        @override
        Future<List<Book>> getBookList() async {
    
            List<Book> booksFromLocalStorage = await Hive.get(); // Using Hive
            return booksFromLocalStorage;
        }
    
    }
    

    我不知道该把逻辑放在哪里来决定是从远程还是从本地获取数据

    当前的实现是这样的

    class HomePageController {
    
    
      late BookRepository _bookRepository;
    
    
      Future<List<Book>> retrieveBooks() async {
    
          if (hasInternetConnection) {
             _bookRepository = BookRemoteRepository();
          } else {
             _bookRepository = BookLocalRepository();
          }
    
          return await _bookRepository.getBookList();
    
      }
    
    
    }
    

    那个 retrieveBooks 中的方法 HomePageController 如果用户按下UI上的按钮,将调用。

    我是否正确实现了存储库模式?我需要单独上课来决定吗?我不知道该把逻辑放在哪里来决定是从远程还是从本地获取数据

    0 回复  |  直到 4 年前
        1
  •  0
  •   Carlos Sandoval    4 年前

    您应该检查DDD模式,不确定它是否与存储库模式相同,但在这里您可以看到存储库背后的逻辑。

    https://resocoder.com/2020/03/09/flutter-firebase-ddd-course-1-domain-driven-design-principles/

    https://github.com/mhadaily/flutter-architecture-ddd/tree/master/enterprise/lib/catalog/infrastructure

    因此,想法是让数据源(hive、api、json等)和存储库中的逻辑决定要使用哪个数据源。