【问题标题】:Repository pattern with different local and remote behavior具有不同本地和远程行为的存储库模式
【发布时间】:2018-07-08 02:00:30
【问题描述】:

我有一个问题需要回答。

我第一次尝试实现存储库模式,我在项目的大部分部分都成功实现了它,但现在我不知道如何解决这个问题。

基本上我需要更新用户的图片,所以在我的存储库中我有一个

updatePicture(userId: Int, picture: File) 

接口,对于存储库实现和远程数据源实现来说一切正常,但是你知道本地数据源不使用文件来表示用户的图片,它使用 url 字符串,所以在接口应该是本地数据源

updatePicture(userId: Int, picture: String)

但是由于存储库的概念使本地数据源实现与远程数据源相同的接口,我不知道如何解决这个问题。

感谢您的帮助

【问题讨论】:

  • 抱歉,我需要更多信息。我知道您有一个存储库接口和两个具体实现,一个用于执行网络请求并更新服务器端中的图片,另一个存储库使用您的本地缓存(我假设使用数据库、Room、ORMlite、Real 等)像那样)。我明白你在说什么,但问题是当你发出请求时,你应该在存储库实现内部更新你的应用程序缓存。请指定您调用这两个updatePicture 方法的流程。
  • 您可以拥有您的缓存存储库、您的网络存储库和一个复合存储库(其中包含这些存储库的两个实例),然后在那里执行网络请求并更新您的应用程序的缓存。但我需要知道你是如何调用updatePicture 方法的。从网络存储库中点击updatePicture 方法后,您是否尝试从缓存存储库中调用updatePicture 方法?

标签: android architecture repository-pattern


【解决方案1】:

这是两个不同的用例。这些方法实现不同的目的,因此应该是不同的方法:picID = uploadPicture(picture:File) 上传图片并为其分配 ID,updateUserPictureReference(userId:int, picID:int) 将该图片 id 分配给用户。这使您可以更轻松地将同一张图片分配给多个用户(即默认个人资料图片),或恢复为以前使用的图片。

顺便说一句,我不会将 URI 直接分配给用户,因为这会将您锁定在当前目录结构中。分配一个 ID 并在运行时使用该 ID 构建一个可预测的 URI。如果您稍后决定重组站点,因为您非常成功,您需要移动它们以获得性能,您可以轻松地做到这一点。使用数据库中的 URI,您必须更新适当的数据。它还使调试变得更容易,因为在开发过程中,您可以让所有链接指向一个 URL,而在生产中它们指向其他地方。

【讨论】:

  • 谢谢,这很有帮助:)
【解决方案2】:

您可以将签名更改为使用Uri 而不是File

// Instead of this:
updatePicture(userId: Int, picture: File)

// Use this:
updatePicture(userId: Int, picture: Uri)

这应该可行,因为Uri 可以使用不同的方案表示来自各种地方的资源。例如,您可以用file://... URI 表示本地文件资源,并用https://... 表示可以使用HTTP 获取的远程资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2014-10-19
    • 2011-09-16
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多