Al momento sto lavorando su un'app di gioco scalabile front-end server-side che fa un sacco di snippet HTML e JSON da molte altre app Web prima di mettere insieme tutto e inviarlo in risposta al browser.
Poiché molte di queste altre app Web sono legacy, non espongono le API REST e devono essere richiamate come se i browser / client li chiamassero direttamente. Ciò significa che richiedono cose come ID di sessione, stateKey, oltre a varie intestazioni e cookie, ecc., Che usano per tracciamento, autenticazione, ecc. Stiamo lentamente ri-scrivendo i nostri sistemi per essere più belli, ma nel frattempo, ci sono ancora molte di queste app con cui questo front-end deve lavorare.
In Play, l'oggetto Request passato a un Controller è immutabile e ha convenientemente tutti i dati di cui sopra. Non volevamo che i nostri controller avessero tutta la logica per chiamare le varie app Web, quindi le abbiamo inserite in varie classi "Service".
La domanda che ho è, quando si chiamano i metodi su questi servizi, è ragionevole passare un oggetto Request a loro (insieme ad altri dati)? Sembra un'area grigia perché, mentre alcuni potrebbero chiamarlo "code-odore", nel caso di un'app di front-end come la nostra che fa parecchio (essenzialmente) proxy, sembra anche ragionevole.
Per iniziare, alcune opzioni sono:
A. Passando l'intera richiesta
// Service method
def getData(req: Request): HtmlSnippet = {
Ws.url(serviceAddress)... // configure request using req
}
// Call from controller
getData(req)
B. Passa tutto il necessario uno per uno
// Service method
def getData(loadBalancerCookie: Cookie, StateKey: StateKey, headers: Seq[Header], sessionId: String .. ): HtmlSnippet = {
Ws.url(serviceAddress)... // configure request using params
}
// Call from controller
val lbCookie = req.lbCookie
val stateKey = req.stateKey
...
getData(lbCookie, stateKey, headers, ..)
C. Comprimi tutto in un oggetto separato
// Custom object
case class GetDataArgs(loadBalancerCookie: Cookie, StateKey: StateKey, headers: Seq[Header], sessionId: String)
// Service method
def getData(args: GetDataArgs): HtmlSnippet = {
Ws.url(serviceAddress)... // configure request using GetDataArgs
}
// Call from controller
val getDataArgs = GetDataArgs(req.lbCookie, req.stateKey, ...)
getData(getDataArgs)
Altri suggerimenti sono benvenuti, poiché sto cercando di trovare un buon equilibrio tra facilità di manutenzione, buona progettazione e comprensibilità.