Controllori che passano Richiedono oggetti per la logica di backend che inoltrano Dati di richiesta: Buono o cattivo?

0

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à.

    
posta lloydmeta 09.10.2014 - 16:00
fonte

0 risposte

Leggi altre domande sui tag