通过接口注入F绑定的多态类型

时间:2018-02-02 08:33:35

标签: scala dependency-injection

我正在尝试为基于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提供程序。有没有人建议如何实现这种自动装配或更好的设计?

0 个答案:

没有答案