37 messaggi dal 18 agosto 2006
Ciao a tutti, stò cercando un aiuto per risolvere il seguente problema:
Stò utilizzando in un'applicazione asp.net il pattern Provider Model per eseguire il caricamento a runtime dei provider specificati nel file di configurazione, attraverso la dependency Injection.

Di norma il Provider Model è basato su una classe astratta che può derivare direttamente o indirettamente dalla classe ProviderBase e contiene tutti i metodi e le proprietà astratte che verranno condivise da tutti i provider che erediteranno da essa.

Quindi se nella classe astratta io scrivessi un metodo del tipo

public abstract string GetUser(string userName);

tutti i provider implementeranno il metodo GetUser in maniera speculare firma compresa.

Quello che stò cercando di fare, è si ereditare il metodo GetUser, ma poter definire il tipo di ritorno asseconda del provider che viene inizzializzato.

Mi spiego meglio:
Supponiamo di avere la classe astratta di cui sopra con il metodo GetUser.
Supponiamo ancora di avere tre provider concreti che derivano da essa.

ProviderA
ProviderB
ProviderC

tutti e tre erediteranno il metodo astratto GetUser.
Io vorrei poter dire (e non so come fare) il metodo GetUser implemetato nel ProviderA restituirà un tipo string, quello del ProviderB un tipo List<Object> e quello del ProviderC un int.

Sono sicuro che attraverso i Generic si possa fare, ma non so come procedere.

Potete darmi un consiglio.

Grazie mille
DanEsp ha scritto:
Quello che stò cercando di fare, è si ereditare il metodo GetUser, ma poter definire il tipo di ritorno asseconda del provider che viene inizzializzato. [...]
Io vorrei poter dire (e non so come fare) il metodo GetUser implemetato nel ProviderA restituirà un tipo string, quello del ProviderB un tipo List<Object> e quello del ProviderC un int.

Sono sicuro che attraverso i Generic si possa fare, ma non so come procedere.

Semplicemente impossibile: le regole di ereditarietà non consento (giustamente!) di variare in alcun modo la firma di un metodo.

Matteo Casati
GURU4.net
37 messaggi dal 18 agosto 2006
Ciao Matteo, grazie un migliardo di volte per avermi risposto. Si sono daccordo con te finchè il metodo da sovrascrivere ha una firma ben definita, ma se invece di venir dichiarato con una firma del genere:

public abstract string GetUser(string username)

fosse dichiarato come:

public abstract T GetUser(string username)

magari le cose sarebbero diverse.

Perdonami se scrivo delle minchia......., ma non ho molta dimestichezza in questo genere di cose, semplicemente perchè è da poco che mi ci sono avvicinato e comunque mi sembrano costrutti molto potenti.

Non trovi?

Daniele
Secondo me sei su una strada sbagliata

Il provider model serve per far sì che l'utilizzatore invochi il servizio esposto dal provider senza conoscerne l'implementazione concreta.

Il tuo approccio presuppone che invece l'utilizzatore *conosca* il provider concreto che è stato selezionato, cosa che è in contraddizione con la frase di prima.

Probabilmente la soluzione provider based non è adeguata al requisito che devi gestire.
Ciao,
m.
L'uso dei generics come nel tuo esempio non risolve il problema ma lo complica! Nel senso che (al di là di eventuali vincoli su T) dovresti implementare ogni provider affinché restituisca T (quindi senza che a lui sia noto che si tratti di stringa, intero o classe user)
Se provi a buttar giù un po' di codice te ne accorgi immediatamente.

Detto questo ti consiglierei di rivedere la tua architettura e il modo in cui stai applicando i pattern: che senso ha che lo stesso metodo possa restituire tre oggetti così diversi (int, string e User)? Mi aspetterei sempre di ottenere un'istanza di User o, quanto meno, di IUser (un'eventuale interfaccia comune agli utenti gestiti dai 3 provider)
In caso contrario devi rinunciare alla possibilità di applicare pattern architetturali com abstract factory o provider model.

Matteo Casati
GURU4.net
37 messaggi dal 18 agosto 2006
Ciao ragazzi grazie per i consigli, la nebbia davanti a me stà iniziando a dissolversi.

Forse è il caso che vi illustri anche l'obiettivo finale magari riusciamo a trovare la vera soluzione al problema.

Sostanzialmente stò cercando di scrive una specie di API da poter utilizzare come SingleSigneOn nelle applicazioni Web.
In pratica, stò concentrando gli utenti in unico database da usare come singolo Repository nelle attività di login recupero delle password ecc. Quindi ho pensato ad una architettura a provider che asseconda del contesto (quindi dell'applicazione) in cui viene usata, restituisse un tipo più comprensibile per quell'ambiente.
Quindi rispondendo ad a m.casati, potrebbe aver senso un metodo GetUser che restituisca un tipo più idoneo, non so magari i dati dell'utente sottoforma di matrice di stringhe o in formato xml.

Quindi pensavo, realizzare ul modello a provider con le seguenti classi concrete:

ASPNETPROVIDER
PHPPROVIDER
ASPPROVIDER

ed avere seguendo un interfaccia comune in tutti e tre il metodo GetUser che restituisce un tipo compatibile al contesto in cui viene richiamato.

Ora aprescindere se ciò sia fattibile o meno con un modello a Provider, che strada posso seguire o meglio cosa mi consigliate per affrontare al meglio questo problema?

Ovviamente non pretendo che mi scriviate il codice, ma avere delle idee su come avreste proceduto è per me già tanto.

Grazie
Daniele
252 messaggi dal 29 settembre 2009
Sono pienamente d'accordo con i post fatti da m.casati e Cradle poiche implementare un'architettura a provider serve proprio a rendere il codice client indipendente dalle implementazioni del provider ,

Es.
0)Interfaccia Alfa
1)Provider A che utilizza file xml ed implemeta Alfa
2)Provider B che utilizza DB ed implemeta Alfa


Codice Client utilizza un porvider A o B (in maniera intercambiabile utilizzando l'interfaccia Alfa)

Adesso però secondo me si puo fare qualcosa nel tuo caso ad esempio

Il tipo di ritorno del tuo Provider GetUser(...) ritorna un tipo che deve implemetare un certa interfaccia Beta il codice Client utilizza l'interfaccia Beta dei tipi di ritorno (Discorso praticamente analogo al precedente).

Il mio discorso è del tutto genrale non so se sia poi effettivamente la strada giusta per risolvere il tuo problema specifico.

Saluti =)
Modificato da claudio_dg il 30 giugno 2010 15.03 -
37 messaggi dal 18 agosto 2006
Ciao Claudio_dg, non penso di aver capito bene, potresti farmmi un esempio veloce con del codice compreso la parte client, in modo da comprendere meglio?

Grazie
Daniele

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC