具有不同本地和远程行为的存储库模式

Repository pattern with different local and remote behavior

我有一个问题需要回答。

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

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

updatePicture(userId: Int, picture: File) 

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

updatePicture(userId: Int, picture: String)

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

感谢帮助

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

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

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

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

表示可以使用 HTTP 获取的远程资源

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

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