2013-04-25 9 views
8

Abbiamo un'applicazione a 3 livelli per cui ogni chiamata dal livello di servizio passa al livello aziendale e al peresist dal livello dati. I componenti di ogni livello possono chiamare solo il livello sottostante;Nell'architettura a più livelli, posso saltare il livello aziendale per le operazioni di crudismo?

Tuttavia, poiché abbiamo centinaia di entità e abbiamo molti servizi correlati alle operatività di crudele, tante controversie sono state sollevate dal nostro team.

Alcuni credono per motivi di manutenzione e facilità di sviluppo, è meglio chiamare l'accesso ai dati da servizi grezzi che eseguono operazioni semplici e ignorano il livello aziendale.

Al contrario, alcuni dicono che dobbiamo creare un wrapper per l'accesso ai dati di ogni entità nel livello aziendale e chiamare questi wrapper dai servizi e non consentire mai ai servizi di chiamare il livello di accesso ai dati.

Nella tua idea in che direzione dovremmo prendere? Va bene per i servizi di greggio chiamare accessi ai dati e bypassare il livello aziendale?

risposta

5

Se non esiste una logica aziendale da eseguire, non c'è motivo di imporre un livello aziendale. L'architettura a 3 livelli non è un protocollo arcano, solo una best practice che è stata formata assumendo l'elaborazione aziendale.

In un'applicazione corrente si accede spesso ai DAO direttamente dai controller JSF quando non è coinvolto alcun processo aziendale. L'idea è stata data da un java champion che ha sottolineato l'idea che la semplicità è fondamentale.

Se si è preoccupati per le modifiche future che potrebbero richiedere l'aggiunta di business logic. Penso al problema in questo modo: la logica aziendale aggiuntiva verrebbe comunque aggiunta al livello aziendale, incluso l'accesso ai dati, quindi non c'è alcuna differenza qui.

Il codice CRUD è in gran parte molto semplice. Quindi il cambiamento nel servizio equivarrebbe a reindirizzare una singola chiamata o un paio di chiamate dal DAO a un EJB - un semplice refactoring. Il codice CRUD stesso rimarrebbe, ma verrà inserito nel bean, un altro semplice refactoring.

Questo non è perfetto, ma IMO meglio l'alternativa: avere uno strato di riferimento indiretto vuoto. Ciò aggiunge complessità che non ha alcuno scopo. L'oggetto business non farebbe altro che inoltrare le chiamate al DAO.

Ci sono due code smells che penso si applichino in questo caso: complessità artificiosa e feature envy.

Non sto dicendo che DA nel livello aziendale è in qualche modo un odore di codice. Quello che voglio dire è che avere un oggetto business che fa nient'altro ma che il DAO è proxy è un odore. Lo stesso vale per la complessità: una struttura dati aggiunta/un livello architettonico che non serve a nessuno scopo: sembra che ci sia già un DAL nella tua applicazione.

Un altro aspetto da tenere in considerazione sarebbe: quanto è sorprendente per uno sviluppatore vedere un servizio che utilizza direttamente un DAO? Avere 5 servizi in cui 2 di essi accedono direttamente a DAO è diverso dall'avere 100 servizi in cui solo un servizio accede direttamente ai DAO.

Nel primo caso la semplicità del codice supererebbe la complessità concettuale aggiunta (2 concetti per una singola cosa), nel secondo caso preferirei rimanere con il livello aziendale: la sorpresa (detta anche effetto WTF;) di farlo diversamente solo una volta sarebbe troppo grande.

+2

Come al solito, cristallino! Anche se la domanda è auto-contraddittoria in natura ("come posso saltare sempre il livello intermedio in un'applicazione che si basa su di esso"). – skuntsel

+1

@skuntsel - grazie :) Sì, se i DAO sono considerati parte del livello aziendale, allora sei fissato con i 3 livelli - per me i DAO fanno parte del DAL, quindi sto perdendo uno strato con un verbo economico trucco;) – kostja

+0

E se in un secondo momento dovessi aggiungere un po 'di business prima di fare operazioni CRUD? se aggiungi il codice aziendale nel livello di servizio è sbagliato perché i servizi non dovrebbero avere codici aziendali, quindi devi aggiungere business in Business Layer, cambiare il servizio per ottenere la sua attività e fare il suo lavoro quindi devi cambiare 2 luoghi diversi per aggiungere attività commerciale. che è un problema, credo! –

0

Se si dispone solo di operazioni CRUD, è possibile utilizzare i servizi di dati per pubblicare i propri set di dati come servizi Web. Un buon esempio di questo è WSO2 Data Services http://wso2.com/products/data-services-server/

3

A mio parere, dopo aver chiamato i servizi CRUD bypassando il livello aziendale, si avvierà la conversione del livello di servizio corrente in un livello aziendale man mano che si aumenta la funzionalità. Quindi il tuo livello di servizio agirà anche come livello aziendale, se stai bene con esso.

Nella maggior parte dei casi, si ha a che fare con un'entità e, probabilmente, che potrebbe coinvolgere molte chiamate sporche di livello dati, ad esempio su un aggiornamento. A questo scopo è consigliato un livello aziendale. E il livello aziendale è il luogo in cui eseguire qualsiasi regola aziendale, memorizzando nella cache o chiamando altri servizi aziendali, se necessario. Ciò manterrà il livello superiore semplice e passerà attraverso.

+0

La mia preoccupazione principale è non consentire al livello di servizio di diventare un livello aziendale. a parte come ha detto @kostja e penso che sia giusto "avere un oggetto business che non fa altro che procurare il DAO è un odore". Sono davvero interessato alla tua decisione se devi intraprendere un percorso che approccio sceglieresti? proxy il doa nel livello aziendale o chiamando dao dal livello di servizio? –

+0

Se pensi che ci possa essere qualcos'altro che vuoi fare, oltre a chiamare le operazioni di crudele ora o in futuro, sostengo fortemente di passare attraverso un livello aziendale. Ciò impone quanto meno codice o refactoring dovrai fare in seguito. Se pensi che sia una possibilità remota, usa semplicemente i DAO senza alcun proxy. Solo tu puoi giudicarlo. – techuser

+0

Quindi stai bene con il salto del livello aziendale nelle operazioni crude. quindi stai dicendo che il design delle applicazioni piercing per semplicità non è un problema? tuttavia la mia esperienza mostra se rimuovo il riferimento DA dal progetto del livello di servizio, gli sviluppatori codice molto più pulito per consentire loro di accedere a DA in Service Layer! possono abusare del business dell'accesso e della miscelazione in ServiceLayer! non la pensi così? –

1

Non ignorerò il livello aziendale. Anche se potrebbe sembrare che si sta solo effettuando il proxy della chiamata per il DAL nel BL, e anche se questo può essere un caso di operazione CRUD molto semplice, il BL può incapsulare la logica di convalida richiesta per l'operazione. La logica di convalida può essere eseguita sul BL e il proxy verso il DAL verrà eseguito solo se le condizioni di convalida sono soddisfatte.

+0

E se i livelli e i livelli sono corrispondenti? Vale la pena effettuare una chiamata a 3 processi separati per un'operazione di crude semplice ?? –

Problemi correlati