Repository存储库模式 – Abhishek Chaudhary


Repository模式又称为仓储模式或存储库模式,替代以前的DAO模式:

存储库模式限制我们在应用程序直接使用数据库的数据,并为数据库操作,业务逻辑和应用程序的UI创建新层。

它是软件设计模式的一部分。但是,当我们可以直接编写代码时,为什么这些模式如此重要?好吧,作为开发人员,当我们开始学习编码时,我们单独处理项目或大约2人,并且通常不打算在将来拥有更多功能/服务。

但是暂时认为你正在组建一个团队来开发软件,可能超过10-20个开发人员需要实现客户端提供的一些功能。你开发软件,测试并运送它,但,哦现在,客户还有一些新的创新功能请求。但是应用程序代码是基于之前指定的某些数据/网络请求,那么如何在不破坏旧功能的情况下添加新功能并确保团队中的开发人员不会搞砸事情呢?
嗯,这就是事情,真的很难做到这一点,并且从新来源添加新服务非常普遍。
因此,我们需要开发能够承受任何类型的新功能和数据源的代码,并确保没有开发人员打破流程。这就是使软件健壮的原因,事实上,它可以实现可扩展性和可管理性,在组织中以前所未有的数量为您节省宝贵的资金。您可能已经听过很多这样的一个例子是MVP或MVVM模式,它确保每个开发人员遵循指定的模式并且不能破坏任何东西,因此是可扩展的。

它是如何工作的?
什么存储库模式呢?正如我所提到的,我们从网络,数据库等来源收集数据,或者事实上我们可以使用用户设备内的数据。您可能拥有一个具有良好API的网络服务,但如果您需要像Live Feed或Google Analytics一样添加新API,该怎么办?
有一个新的数据源,我们需要使它与旧的数据源一起使用。如果网络不可靠并且您无法向用户显示该怎么办?
嗯,这就是存储库实现的目的,它将数据层与实现层或UI层分开。
数据层本身被划分为不同数据源的抽象节点,最重要的是在存储库模式数据库中被视为单一的事实来源。
这意味着无论数据来自何处(如网络),它总是先添加到数据库然后用于任何其他目的,因为数据库在提供数据方面是安全可靠的(即 I / O) 。
因此,我们可以提出我们想要的任何网络请求,将其存储在数据库中,然后在我们的软件中使用该数据。
现在已经足够了,但让我们关注如何。因此,我将向您展示我在我自己的Android应用程序中使用的Google文档中使用的存储库模式示例,该应用程序称为新闻应用程序。

如上所示,数据来自使用Retrofit的API ,也来自使用Room的本地数据库。我正在使用NewsAPI获取新闻数据并将其存储在本地数据库中,包括用户保存的故事。
存储库根据需要提供来自适当源的数据,在我的情况下,我总是调用网络API,在此之前我显示先前存储在数据库中的数据,因此如果请求失败,数据仍然存在,并且一旦网络请求是成功更新数据库,UI也是如此。
在这里,我使用了LiveData 作为返回类型,这样无论何时数据库更新,返回的对象都会收到更改通知。在getHeadlines()方法中,我检查来自API的数据并显示数据库中的数据(如果存在)。当网络请求完成时,数据将添加到数据库并通知LiveData。通过这样做,我们确保不发送任何不必要的网络请求,或者即使网络请求失败也会向用户显示数据。
现在,如果我们想添加一个新的API,我们只需要向它添加网络调用,并且UI仍然不知道更改,因为存储库提供的数据与数据的来源无关,并始终确保返回类型。

好处:
如何在不更改方法签名或传递到存储库的变量的情况下请求特定类型的数据。最好的方法是创建一个具有数据请求可能具有的所有相关规范的Specification类。在新闻应用程序中,它是新闻的类别,新闻来源国和文章的语言。因此,我将所有规范包装在一个类中,并将其作为参数传递给存储库中的每个方法,从而确保固定的方法签名。

可以在我的Github页面上找到该应用程序的代码。如果您喜欢它,请查看参考资料并为回购邮件加注星标。