Il livello controller dovrebbe creare oggetti del modello o dovrebbero essere creati dal livello di servizio?

2

Ho una piccola applicazione con livelli classici Controller-Service-Dao. Il controller è in realtà la risorsa REST, che tratta i dati JSON. E le domande sono: 1. dove è il posto migliore per creare oggetti business da primitive JSON? Controller o servizio? Il controller deve passare primitive da JSON a metodi di servizio? 2. Se gli oggetti devono essere creati nel livello controller, è opportuno passare il valore del metodo del servizio nel caso in cui si tratti di una sorta di metodo di ricerca per ID?

UPDATE 1. Sto parlando di java:

serviceSearchMethod(int value1, String value2);

vs

SomeObject someObject = new SomeObject(int value1, String value2);
serviceSearchMethod(someObject);

Naturalmente, può essere che someObject contenga 10 campi, ma il controller ha solo 2 valori, quindi è buono in questo caso creare business object (BO) o è adatto solo nel caso in cui io possa creare BO che è non solo DTO per il livello di servizio, ma qualcosa di prezioso dal punto di vista del business?

    
posta sphinks 28.02.2016 - 01:16
fonte

2 risposte

4

Preferisco convertire il JSON in oggetti business il prima possibile, e generalmente questo viene fatto nella classe del controller REST. Ci sono dei motivi per questo:

  • JSON è un formato di trasporto dati. In un sistema di grandi dimensioni potrebbero esserci altri formati di trasporto dati (ad esempio XML o CSV). Quindi, se possibile, la tua rappresentazione interna dovrebbe essere indipendente dal formato dei dati.
  • Gli oggetti di business di solito hanno metodi comportamentali. Se i dati sono ancora in formato JSON, quindi buona fortuna con la scrittura di metodi comportamentali:)
  • Nella maggior parte dei sistemi, gli oggetti vengono creati in codice e arrivano sul filo. Sarebbe strano dover creare un oggetto JSON piuttosto che un POJO Java.

Ma un avvertimento: la mia esperienza è stata con i servizi REST di Java. Se stai utilizzando un framework Javascript lato server, potrebbero essere applicate altre considerazioni.

    
risposta data 28.02.2016 - 05:12
fonte
1

Lavoro con molti di questi sistemi (costruito in PHP, non in Java, ma è lo stesso principio) e sono d'accordo con @kiwiron: è meglio farlo nel livello Controller.

Ecco alcuni dei miei motivi per consigliarlo in questo modo:

  • il livello Controller agisce come un gateway in-and-out del tuo sistema, un comunicatore con il mondo esterno . Poiché JSON è il formato utilizzato per comunicare con l'esterno, la responsabilità per la codifica / decodifica da / a quel formato dovrebbe essere da qualche parte in quel livello.
  • I sistemi REST (che è quello che hai menzionato) utilizzano nel 99,99% dei casi il protocollo HTTP per il trasporto. Ciò significa che puoi e sarebbe bello negoziare il contenuto da e verso il sistema utilizzando le intestazioni HTTP Accept e Content-Type HTTP (questo è utile perché puoi supportare facilmente più formati contemporaneamente ). Dal momento che i livelli Service e DAO non dovrebbero conoscere assolutamente nulla della comunicazione con il mondo esterno, la responsabilità di capire cosa i client / chiamanti hanno fornito e richiesto (utilizzando le intestazioni HTTP) dovrebbe essere nel livello Controller.

C'è comunque un piccolo problema, questa potrebbe essere una situazione comune in molti di questi sistemi: Cosa succede se hai 3 controller che fanno affidamento sullo stesso servizio (dal livello Servizi)? La migliore pratica sopra descritta sarebbe quella di avere i Controllori a creare gli oggetti modello / entità ... ma se tutti lo fanno, allora avremmo una non violazione del principio DRY .

Quindi, questo è quello che consiglio:

  • per ogni oggetto modello / entità, avere una sorta di Fabbrica o Builder, per trasformarlo in un formato decodificato (magari array?) in oggetti. In questo modo, la trasformazione è in solo 1 posto.
  • usa quelle Fabbriche / Costruttori dal livello Controller
  • fa in modo che i livelli Servizio e DAO funzionino solo con gli oggetti.
risposta data 28.02.2016 - 12:53
fonte

Leggi altre domande sui tag