dependency injection + Adapter ma .....

rated by 0 users
This post has 6 Replies | 2 Followers

Top 25 Partecipanti
Post 11
Punteggio 209

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.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 243
Punteggio 3.383
Ci vorrebbe un esempio più completo per capire come hai strutturato il tutto. Comunque i principi di Dependency Injection prevedono che l'interfaccia del servizio sia conosciuta.
 
Ad esempio puoi avere un servizio IFatturazione che espone le funzionalità di fatturazione, la classe di business potrebbe avere un costruttore che accetta un oggetto di tipo IFatturazione ignorando però l'effettiva implementazione.
 
I vantaggi? Ad esempio, IFatturazione è esposta da un servizio WCF, hai più istallazioni del tuo software, in alcune situazioni hai tutto in una macchina, non ti conviene nemmeno usare WCF per cui passi alla classe di business direttamente la classe che implementa il servizio. Vuoi abilitare il logging? Vai di AOP e inietti un logger nelle funzioni che vuoi etc.
 
alk.
<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

  • | Punteggio Post: 44
Top 25 Partecipanti
Post 11
Punteggio 209

E di fatti la classe di business conosce solo l'interfaccia del servizio (in realtà è una classe

astratta) :

   AServiceBilling billing(itemToSell);     // servizio

   BSale bSale();

   bSale.setService(billing);

   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 

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 243
Punteggio 3.383

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..... 

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

  1. Prendere l'oggetto in ingresso e serializzarlo in XML
  2. Applicare una trasformata XSLT (o LINQ to XML)
  3. Deserializzare il risultato della trasformata

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.

Top 25 Partecipanti
Post 11
Punteggio 209

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).

 

_ _

Onorato.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 243
Punteggio 3.383

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.

  • | Punteggio Post: 20
Top 25 Partecipanti
Post 11
Punteggio 209

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.

_ _

Onorato.

  • | Punteggio Post: 5
Pagina 1 di 1 (7 elementi) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems