我正在尝试为基于Play的服务开发一个小组件,并且正在努力解决如何进行设计问题。我需要一种能够在各种环境中访问“文件存储”的服务。我最初的想法是创建一个表示两个主要操作(写/读)的特征,然后根据运行时的配置自动执行实现。界面如下所示:
trait StorageService {
def saveFile(name: String): Sink[ByteString, Future[Try[FileHandle]]]
def readFile(handle: FileHandle): Source[ByteString]
}
该服务允许用户将文件保存到磁盘并返回FileHandle
对象,该对象包含服务识别特定文件所需的所有信息。我遇到的问题是FileHandle
需要为每个具体实现提供不同的信息。现在,我可以在特征上使用F绑定多态来解决这个问题:
trait StorageService[A <: FileHandle] {
def saveFile(name: String): Sink[ByteString, Future[Try[A]]]
def readFile(handle: A): Source[ByteString]
}
但是,此处的问题变为自动装配,因为我无法在不指定类型参数的情况下将具体实现连接为StorageService
提供程序。有没有人建议如何实现这种自动装配或更好的设计?