2010-08-10 10 views
7

Ho letto su DDD e penso che potrei usare i servizi in modo sbagliato o almeno in un modo non così ideale. Le mie classi di servizio tendono ad avere alcune variabili di istanza contenenti riferimenti al repository e sembrano svolgere un sacco di lavoro (ho molti metodi).Sto usando correttamente il livello di servizio?

È consigliabile creare servizi più mirati? Come un metodo per servizio che esegue una logica specifica? Inoltre, le classi di servizio dovrebbero memorizzare le variabili di istanza in altre entità? Ho letto qualcosa sui servizi che sono senza stato, non sono sicuro di infrangere quella regola avendo queste variabili di istanza.

Grazie!

risposta

14

mie classi di servizio tendono ad avere bel alcune variabili di istanza ...

questo non è necessariamente un codice-odore. Se il tuo servizio richiede molte dipendenze per completare il suo lavoro, allora questo è semplicemente un dato di fatto.

... sembrano fare molto lavoro (ad esempio hanno molti metodi).

È consigliabile creare servizi più mirati?

Come regola generale, il più granulare è possibile effettuare i servizi di interfacce (cioè il minor numero di metodi), il migliore (mai avuto alla pesca a strascico attraverso un'interfaccia con cinquanta metodi su di esso alla ricerca di quello che si desidera chiamare?). Ma a meno che non si stia rilasciando come API pubblica, la granularità delle interfacce di servizio può essere perfezionata man mano che si procede. Spesso, all'avvio di un progetto, inizierò con un solo servizio e lo dividerò nel tempo. Se sei il consumatore di questi servizi, quando inizi a sentire il dolore dell'interfaccia diventare grande, saprai che è ora di lasciarlo. Naturalmente, se questa è una API pubblica, allora dovrai fare molto più design in anticipo.

Inoltre, le classi di servizio devono memorizzare le variabili di istanza in altre entità? Ho letto qualcosa sui servizi che sono senza stato, non sono sicuro di infrangere quella regola avendo queste variabili di istanza.

La memorizzazione delle dipendenze come variabili di istanza non implica necessariamente che il servizio non sia stateless, purché anche le variabili di istanza siano stateless. Per essere considerati apolidi, i richiami di metodo su un servizio non devono in alcun modo dipendere dai metodi precedenti chiamati. Dovresti essere in grado di caricare una singola istanza di servizio e condividerla per la tua applicazione (ad esempio, un'istanza di un servizio stateless non dovrebbe essere specifica per una particolare sessione dell'utente). In altre parole, il tuo servizio non dovrebbe mantenere alcun stato tra le chiamate di metodo. La memorizzazione di una dipendenza di repository senza stato come variabile su un'istanza di servizio non viola questo requisito.

La ragione per cui i servizi senza stato sono un obiettivo desiderabile, non avere uno stato riduce notevolmente la possibilità di errori.Semplifica la verifica di un metodo di servizio limitando i casi di test alla variazione dei parametri passati, piuttosto che doversi preoccupare dello stato precedente del servizio. Può anche offrire vantaggi prestazionali.

+0

Grazie per l'ottima risposta MJ! Questo aiuta molto. – chobo

+0

@ MJ Richardson Puoi condividere il tuo ID e-mail (il mio è aggiunto al profilo)? Ho alcuni dubbi che vorrei chiarire riguardo a questo post. –

0

Consiglierei di leggere l'iniezione delle dipendenze, l'inversione del controllo e simili.

Ecco l'articolo di Fowler: http://martinfowler.com/articles/injection.html, anche se l'ho sempre trovato un po 'esagerato. Vorrei provare a camminare attraverso un tutorial che rappresenta l'utilizzo di un contenitore DI/IoC.

Problemi correlati