Salve a tutti,
avrei una domanda da farvi. Per la mia applicazione ho la necessità di invocare dei serivzi che
interfacciano il mio sistema verso sistemi esterni. e fino a qui ....
Fino ad oggi succedeva che ogni classe di business che aveva bisogno di invocare il sistema
esterno si istanziava la classe relativa, valorizzava i dati da spedire al sistema ed inviava il mess.
Adesso sto cercando di disaccoppiare il tutto applicando la dependency injection e "adattando" le classi
dei servizi ed iniettando quindi il servizio alla classe di business.
Il problema ora è : come fa a sapere la classe di business quali dati dovrà valorizzare ?
lei (la classe di business) non sa quale servizio invocherà. La risposta è (sbagliata :-) )
che lo sa la classe Adapter specifica perchè avrà in input i dati specifici in fase di costruzione dal client. Ma la
vera domanda è : è corretto avere una classe adapter di servizio per ogni funzionalità ? del tipo :
Client::selling(Item itemToSell)
{
AServiceBilling billing(itemToSell); // servizio ("Adattato") che si occupa della fatturazione (verso un sist. ext.).
BSale bSale();
bSale.setService(billing);
bSale.sale();
}
//Altro Esempio
Client::AnotherService(Item_2 item_2)
AServiceBilling_for_AnotherService billing(item_2);
Spero di essermi spiegato.
Saluti.
_ _
Onorato.
<softwareEngineer> wrote in message news:229@217.29.163.44... Salve a tutti, avrei una domanda da farvi. Per la mia applicazione ho la necessità di invocare dei serivzi che interfacciano il mio sistema verso sistemi esterni. e fino a qui .... Fino ad oggi succedeva che ogni classe di business che aveva bisogno di invocare il sistema esterno si istanziava la classe relativa, valorizzava i dati da spedire al sistema ed inviava il mess. Adesso sto cercando di disaccoppiare il tutto applicando la dependency injection e "adattando" le classi dei servizi ed iniettando quindi il servizio alla classe di business. Il problema ora è : come fa a sapere la classe di business quali dati dovrà valorizzare ? lei (la classe di business) non sa quale servizio invocherà. La risposta è (sbagliata :-) ) che lo sa la classe Adapter specifica perchè avrà in input i dati specifici in fase di costruzione dal client. Ma la vera domanda è : è corretto avere una classe adapter di servizio per ogni funzionalità ? del tipo : Client::selling(Item itemToSell) { AServiceBilling billing(itemToSell); // servizio ("Adattato") che si occupa della fatturazione (verso un sist. ext.). BSale bSale(); bSale.setService(billing); bSale.sale(); } //Altro Esempio Client::AnotherService(Item_2 item_2) { AServiceBilling_for_AnotherService billing(item_2); BSale bSale(); bSale.setService(billing); bSale.sale(); } Spero di essermi spiegato. Saluti. _ _ Onorato. http://www.guisa.org/forums/p/163/229.aspx#229
--Blog Eng: http://www.codewrecks.com/blogBlog Ita: http://blogs.ugidotnet.org/rgmTwitter: http://twitter.com/alkampfer
E di fatti la classe di business conosce solo l'interfaccia del servizio (in realtà è una classe
astratta) :
AServiceBilling billing(itemToSell); // servizio
bSale.doSale();
In questo contesto BSale (classe di business) conosce la classe astratta (di fatti AServiceBilling deriverà da AbstractBilling) ...
ma il mio problema è : è giusto (e se no, quali alternative ho) che AServiceBilling (concreta implementazione di
AbstractBilling) conosca la struttura itemToSell (che gli serve per valorizzare i suoi campi e inviare un mess al sist. ext) ?
cioè cambiando la struttura (Item_2, come da esempio) mi devo scrivere un altra AServiceBilling_2 ?
Provo a spiegarmi meglio. Ogni servizio è orientato (la faccio semplice) ad inviare un messaggio ad un sistema esterno. Ora
questo servizio vuole dei dati (perchè il sistema esterno ce lo chiede). Ho pensato di fare un Adapter per adattare la struttura
dei dati che arrivano dal client (e saranno diverse) alla struttura che richiede il servizio.....
Come la vedete ?
grazie delle risposte e scusate se mi sono dilungato !
Onorato
A mio avviso se tu dici che
softwareEngineer: ... Ogni servizio è orientato (la faccio semplice) ad inviare un messaggio ad un sistema esterno. Ora questo servizio vuole dei dati (perchè il sistema esterno ce lo chiede). Ho pensato di fare un Adapter per adattare la struttura dei dati che arrivano dal client (e saranno diverse) alla struttura che richiede il servizio.....
...
Ogni servizio è orientato (la faccio semplice) ad inviare un messaggio ad un sistema esterno. Ora
Mi pare di capire quindi che per aumentare il disaccoppiamento tu inserisci un adapter intermedio che fa da broker, prende i dati dal sistema esterno, li trasforma in qualche cosa comprensibile dal servizio e poi li passa al servizio stesso. Questo componente quindi necessita comunque di conoscere le funzioni di trasformazioni e quindi i dati da trasformare, anche se alla fine non ha necessità di dare a nessun dato un significato di business. Un tale componente potrebbe ad esempio
ecco che quindi il tuo componente non necessita di conoscere nulla dei dati di ingresso ed uscita, ma esegue solo la trasformazione e può lavorare direttametne su XML. Questo probabilmente garantisce un buon disaccoppiamentol.
Questo che stai facendo sembra un Message Translator, ti consiglio comunque di leggere il libro che trovi in quel link, ovvero Enterprise Integration Pattern, come tutti i libri sui pattern è utile perchè raccoglie tutti i pattern più comuni dei sistemi distribuiti, con particolare attenzione ai sistemi asincroni basati su messaggi.
alk.
Ecco, un aspetto che non avevo valutato ..... mi ero soffermato sull'adattare le interfacce dei serivizi al mio caso, ma quello che dovevo
fare è "adattare" il messaggio client al servizio ..... di fatti leggendo sul message traslator :
"The Message Translator is the messaging equivalent of the Adapter pattern described in [GoF]. "
Ho trovato il pattern da te segnalato nel 4 volume del libro POSA.
Grazie mille della dritta (e del consiglio sul libro).
Nel libro non troverai la soluzione a tutti i problemi ;) ma come tutti i libri sui pattern consolida una terminologia per gli ambienti distribuiti. In questo modo quando parli di "Message Translator" puoi essere sicuro che gli altri capiscano esattamente di cosa si sta parlando. In più introduce una serie di simboli per i pattern descritti che permettono di fare semplici schemi dei tuoi sistemi. A me è piaciuto.
Alk.
Grazie della dritta sulla soluzione Alk.
Penso che nei libri in generale non si trovano soluzioni ma conoscenza che, a sua volta, aiuta l'individuo a
trovare soluzioni. Se ci rifletti il fine ultimo di scrive un libro è diffondere conoscenza (che poi aiutano a trovare
soluzioni soddisfacenti ai propri problemi magari). Comunque appena avrò finito di leggere quello in corso
("Real Time Design Pattern", io provengo da questo mondo) leggerò quello che mi hai segnalato ho letto qualche
recensione.
Bye.