Progettazione del livello di servizio

5

Sto sviluppando un sito Web MVC in PHP e per la prima volta vorrei implementare un livello di servizio. Ho alcune considerazioni di progettazione su cui vorrei avere qualche consiglio. Il back-end non sarà affatto un grande sistema aziendale, quindi cerco di mantenere le cose relativamente semplici sfruttando ancora i vantaggi di un livello di servizio.

L'idea è che i miei controller interagiranno con i servizi, che a loro volta interagiranno con i DAO. La mia domanda principale è quanto dovrebbero essere granulari i miei servizi. Ho familiarità con il concetto di granularità del servizio in SOA, ma non l'ho mai implementato nella pratica. Ad esempio, per gestire la registrazione dell'utente, dovrei avere una classe RegistrationService o dovrei avere un UserService che contiene un metodo register insieme ad altri servizi relativi all'utente? L'approccio precedente significa che avrò un livello di servizio pieno di servizi piccoli o a grana fine, ma suppongo che sia una buona cosa. Quest'ultimo sembra ostacolare il riutilizzo del servizio e portare a grandi classi con molti metodi.

Invece, forse dovrei combinare i due approcci per garantire che i miei servizi possano essere riutilizzati? Ad esempio, avere un RegistrationService che interagisce con una classe DAO. Quindi, potrei avere una classe UserService con un metodo register . Questo metodo interagisce con RegistrationService a grana fine. In questo modo, RegistrationService può essere facilmente riutilizzato per comporre più servizi a grana grossa. Sicuramente ci sono esempi in cui il riutilizzo sarebbe più probabile; per esempio, un ordine dovrebbe utilizzare / orchestrare molti servizi diversi. Immagino che si possa definire un approccio "stratificato", che ho già visto in precedenza. Posso strutturarlo in modo tale che il mio livello di servizio non diventi un disastro?

Mi piacerebbe sentire le tue opinioni su questo, se hai altri suggerimenti, raccomandazioni, esperienze o commenti sulle idee che ho presentato sopra. Grazie in anticipo.

    
posta Andy0708 26.01.2013 - 16:50
fonte

2 risposte

4

Bene, penso che RegistrationService sia più rivelatore di intenti.

Si può facilmente speculare su quale funzione può essere trovata lì come registerUser() , ConfirmRegisteration() , ResetPassword() , ... ecc. Per me la maggior parte di essi sembra rientrare logicamente in una classe RegisterionService rispetto a una generale classe UserService .

Si suppone che un livello di servizio contenga funzioni che operano su più di un'entità, quindi un UserService potrebbe non essere logicamente il posto migliore per tali operazioni.

    
risposta data 28.01.2013 - 23:24
fonte
0

Le implementazioni dei framework PHP di oggi non utilizzano il livello di servizio, tutti i calcoli del database sono memorizzati nel livello Model (cioè Doctrine & Co). Se vuoi inserire un livello di servizio tra il tuo modello e i controllori, dovresti pensare come "transazioni".

Questo livello ti permetterà di inserire solo operazioni atomiche nel tuo livello database (DAO) e di metterle in catena all'interno delle transazioni nel livello di servizio. Ciò ha ancora più senso se il tuo rdms supporta il rollback della transazione parziale.

Questo livello diventerà quindi il punto in cui le eccezioni tecniche (eccezione della chiave primaria del database) diventano eccezioni aziendali (non è possibile effettuare un'eccezione dell'ordine).

Non so come implementare in modo pulito quello con gli ORM pensato ...

    
risposta data 28.01.2013 - 13:58
fonte

Leggi altre domande sui tag