170 messaggi dal 17 febbraio 2009
Ciao,

in una piccola applicazione Web forms per la gestione di auto usate e noleggio ho implementato un Repository Pattern per distaccare Entity Framework, sviluppare l'applicazione su dei dati Fake (con l'apposita implementazione fake del repository) e fare un po d'esperienza con il pattern in questione  .

L'interfaccia del repository è così definita:
http://pastebin.com/iWsxQUid

Il repository factory:
http://pastebin.com/JJSGW8y2

e l'utilizzo del repository Factory avviene come di consueto all'interno delle varie pagine aspx:
private IUsedCarRepository usedCarRepository = RepositoryFactory.UsedCar();


Ora... avevo intenzione di utilizzare un ObjectDataSource per popolare un ListView visualizzando i dati e utilizzando paginazione e ordinamento.
Il problema è che la property TypeName dell'ODS non può essere impostata facendo riferimento al membro statico della mia classe RepositoryFactory e se faccio riferimento all'interfaccia IEntitàRepository e utilizzo gli eventi onObjectCreating ottengo un errore che mi indica che non viene trovato il metodo GetAll senza parametri bla bla bla....

Ma è possibile procedere in tal senso e usare vantaggi dell'ODS in questi contesti???
Modificato da vailfox il 06 maggio 2012 19.59 -
Modificato da vailfox il 06 maggio 2012 19.59 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

vailfox ha scritto:

Il problema è che la property TypeName dell'ODS non può essere impostata facendo riferimento al membro statico della mia classe RepositoryFactory

Già, si aspetta il nome di un tipo di cui deve poter creare un'istanza. Un factory method non gli va bene.

vailfox ha scritto:

è possibile procedere in tal senso e usare vantaggi dell'ODS in questi contesti???

Certo. Banalmente, ti puoi creare una classe proxy in cui definisci dei metodi con firme idonee alle esigenze dell'ObjectDataSource. Nel corpo di questi metodi andrai ad ottenere un riferimento al repository e ad interagire con esso. Questo potrebbe essere l'ipotetico metodo di selezione con paginazione:

public IList<UsedCar> Seleziona(int maximumRows, int startRowIndex){
  IUsedCarRepository usedCarRepository = RepositoryFactory.UsedCar();
  return usedCarRepository.GetAll().Skip(startRowIndex).Take(maximumRows);
}
Vedi, è richiesto un po' di plumbing ma alla fine della giornata sarà probabilmente la soluzione che ti avrà fatto impazzire di meno per adattare il tuo repository all'ObjectDataSource.

Non c'è dubbio che esistano anche altre soluzioni. Ad esempio, come hai detto tu stesso, potresti gestire l'evento ObjectCreating, recuperare il TypeName (che è una stringa) e fare qualche magheggio con la reflection per ottenere tu stesso l'istanza del repository.

Qui affrontano questo approccio usando un container IoC per farsi dare l'istanza:
http://www.graytechnology.com/Blog/post/Using-Dependency-Injection-with-an-ObjectDataSource.aspx
Secondo me però questo esempio non è completo perché il tipo non lo ottengono dinamicamente dalla proprietà TypeName, ma è semplicemente hard-coded nel corpo del metodo. Bleh... non un pezzo di codice che vorresti mettere in produzione, specie se hai tanti ObjectDataSource in giro per l'applicazione e hai bisogno che quella logica sia incapsulata una volta per tutte in un controllo personalizzato.

ciao
Modificato da BrightSoul il 07 maggio 2012 22.55 -

Enjoy learning and just keep making
170 messaggi dal 17 febbraio 2009
Semplicemente Grazie!!
Provo a mettere in opera.

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.