Ich erstelle eine Async-Bibliothek mit Scala 2.10-Futures. Der Konstruktor für die Bibliothek verwendet eine Folge von benutzerdefinierten Objekten, die ein bestimmtes Merkmal implementieren, und dann sendet eine Methode für die Bibliotheksklasse einige Daten einzeln in die benutzerdefinierten Objekte. Ich möchte, dass der Benutzer die ExecutionContext
für die asynchronen Vorgänge bei der Einrichtung der Hauptinstanz bereitstellt und dann für diesen Kontext bei Bedarf in die benutzerdefinierten Objekte übergeben wird. Vereinfachte (? Pseudo-) Code:Impliziter ExecutionContext an enthaltene Objekte/Methoden übergeben
case class Response(thing: String)
class LibraryObject(stack: Seq[Processor])(implicit context: ExecutionContext) {
def entryPoint(data: String): Future[Response] = {
val response = Future(Response(""))
stack.foldLeft(response) { (resp, proc) => proc.process(data, resp) }
}
}
trait Processor {
def process(data: String, resp: Future[Response]): Future[Response]
}
Es könnte wie folgt verwendet werden:
class ThingProcessor extends Processor {
override def process(data: String, response: Future[Response]) = {
response map { _.copy(thing = "THE THING") }
}
}
class PassThroughProcessor extends Processor {
override def process(request: Request, response: Future[Response]) = {
response
}
}
object TheApp extends App {
import ExecutionContext.Implicits.global
val stack = List(
new ThingProcessor,
new PassThroughProcessor
)
val libObj = new LibraryObject(stack)
val futureResponse = libObj.entryPoint("http://some/url")
// ...
}
ich einen Compiler-Fehler für ThingProcessor
:
Kann nicht eine implizite ExecutionContext finden , benötigen Sie entweder selbst oder importieren Sie
ExecutionContext.Implicits.global
Meine Frage ist, wie kann ich liefern implizit die ExecutionContext
dass LibraryObject
die benutzerdefinierten Objekte hat (ThingProcessor
und PassThroughProcessor
) oder die Methoden, ohne den Benutzer zu machen Sorgen darüber (die die Klassen schreiben werden) - das ist zu sagen, ich würde es vorziehen, dass der Benutzer hat nicht eintippen:
class MyFirstProcessor(implicit context: ExecutionContext)
oder
override def process(...)(implicit context: ExecutionContext) = { ... }
Dies ist nicht für Singleton-Objekte, klar ... können Sie sich einen Workaround vorstellen? –
@ Pagoda_5b meinst du wie das Update? Entschuldigung im Voraus, wenn ich nicht klar denke. –
Ja, sieht ziemlich glatt aus und ich mag es. –