Я пытаюсь использовать Reader monad
для инъекции зависимостей, но имею проблемы, когда методы требуют разных зависимостей:
class PageFetcher {
def fetch(url: String) = Reader((dep1: Dep1) => Try {
...
})
}
class ImageExtractor {
def extractImages(html: String) = Reader((deps: (Dep2, Dep3)) => {
...
})
}
object MyImageFinder {
def find(url: String) = Reader((deps: (PageFetcher, ImageExtractor)) => {
val (pageFetcher, imageExtractor) = deps
for {
htmlTry <- pageFetcher.fetch(url)
html <- htmlTry
images <- imageExtractor.extractImages(html)
} yield images
})
}
// I add these 3 useless dependencies here just for demo
class Dep1
class Dep2
class Dep3
Вы можете видеть, что PageFetcher.fetch
и ImageExtractor.extractImages
и MyImageFinder.find
имеют разные зависимости.
Я не уверен, правильно ли я использую Reader
, и вскоре, когда я объединю их и хочу передать зависимости, я не знаю, как это сделать:
val pageFetcher = new PageFetcher
val imageExtractor = new ImageExtractor
val dep1 = new Dep1
val dep2 = new Dep2
val dep3 = new Dep3
def main(args: Array[String]) {
args.headOption match {
case Some(url) =>
MyImageFinder.find(url)(???) match {
case Success(images) => images.foreach(println)
case Failure(err) => println(err.toString)
}
case _ => println("Please input an url")
}
}
Обратите внимание на код MyImageFinder.find(url)(???)
, я хочу передать зависимости типа pageFetcher/imageExtractor/dep1/dep2/dep3
, и как бы я ни старался, он просто не может быть скомпилирован.
Правильно ли я использую Reader
? Как легко передать зависимости?