Repository Pattern: ok, fucilatemi...

rated by 0 users
This post has 27 Replies | 5 Followers

Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
petrux Posted: 05-21-2010 16.11
....ma io ancora non ho capito come funziona!!! :-(
Avete qualche link da consigliarmi?

Ciao e garzie,
Giulio
--
  • | Punteggio Post: 20
Top 10 Partecipanti
Post 143
Punteggio 2.560
Ciao petrux,

You wrote on 24/05/2010 :
> ....ma io ancora non ho capito come funziona!!! :-(
> Avete qualche link da consigliarmi?

No, se non i soliti triti e ritriti :-)
Quale � il problema?

Io non � che adori il repository pattern se non in scenari dai contorni
molto ben delineati.

> Ciao e garzie,
> Giulio
> --

..m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it
  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907

Ciao Mauro,

[quote user="Mauro Servienti [MVP]"]Ciao petrux,
Quale � il problema? 
 Io non � che adori il repository pattern se non in scenari dai contorni
molto ben delineati.
 [/quote]

Il problema è che non a capisco a cosa possa servirmi. Quindi se mi fai un qualche esempio sui questi scenari ne sarei ben contento. :-)

 

Grazie,

petrux

--

 

  • | Punteggio Post: 35
Top 10 Partecipanti
Post 143
Punteggio 2.560
Ciao Giulio,

You wrote on 25/05/2010 :
> Il problema è che non a capisco a cosa possa servirmi. Quindi se mi fai un
> qualche esempio sui questi scenari ne sarei ben contento. :-)

in un mondo (leggi dominio) complesso con molte relazioni, faccio
decisamente fatica a collocarlo mentre mi viene molto facile collocarlo
in un mondo "monotematico", pensa ad un documento � molto facile
implementare qualcosa del tipo:

interface IRepository where T : IDocument
{
IEnumerable GetByCriteria( IEnumerable filter
);
}

perch� molto probabilmente i criteri di filtro sono sugli attributi del
documento e non spaziano in relazioni che possono annidarsi in maniera
intricatissima... voglio tutti i clienti il cui fatturato � superiore a
"x" nel periodo "y" con sede legale nel cap "z" ma con destinazione
della merce nel cap "k".. ecco questo con un repository faccio un po'
fatica a pensarlo, mentre in questo scenario mi viene molto bene
applicare lo specification pattern e avere un solo entry point allo
storage, come ad esempio � la session di NH.

>
> Grazie,
> petrux

..m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it
  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 243
Punteggio 3.383

Principalmente fa comodo per il testing, soprattutto se lavori con repository in cui hai metodi del tipo

IOrderRepository.GetGoldOrders

dove i gold orders sono presi con criteri molto complessi. In questo scenario puoi sostituire il repository con un mock quando serve e facilitarti il test.

alk.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao alk,


alkampfer wrote:
> Principalmente fa comodo per il testing, soprattutto se lavori con
> repository in cui hai metodi del tipo
>
> IOrderRepository.GetGoldOrders
>
> dove i gold orders sono presi con criteri molto complessi. In questo
> scenario puoi sostituire il repository con un mock quando serve e
> facilitarti il test.

"Ti piace vincere facile?" (cit.)
Cioè... tu vorresti cavartela con così poco? :-D
Scherzi a parte:
- come integri il repository con il DAL?
- come si muovono in una transazione del data context?
- quanto vivono?
- chi usa il repository, vede anche il DAL oppure è il repo stesso che
si occupa della persistenza (e balblabla)?

Ciao e grazie,
petrux

--
  • | Punteggio Post: 35
Top 25 Partecipanti
Maschio
Post 67
Punteggio 1.440

'giorno Petrux, prova a dare una occhiata agli ultimi changeset di NSK, perchè credo che troverai risposta ad alcune delle tue domande :-)

Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907

Ciao Andrea,

Andrea Saltarello:

'giorno Petrux, prova a dare una occhiata agli ultimi changeset di NSK, perchè credo che troverai risposta ad alcune delle tue domande :-)

Ok, cercherò di farlo ASAP.

Intanto grazie e alla prox,

petrux

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

Sostanzialmente spesso adotto un approccio di questo tipo. Usando Nhibernate il repository si appoggia semplicemente a nhibernate per la persistenza, ma in generale se non hai nhibernate è il repository che dialoga con il DAL.con Castle.nhibernate facility inietto il sessionManager nel repository, cosi il repository quando deve accedere al DAL prende la session corrente e fa quello che deve fare.

Per le transazioni dipende dall'ambiente, in asp.net si gestisce il tutto con un httpmodule. Alla prima creazione della sessione il sessionmanager crea la sessione ed inizia una transazione, e nell'end request ed error si committa o si rollbacka. In alcuni progetti ho dei gestori di sessione sulla falsariga di quelli di castle, in sostanza si occupano di capire quando la sessione deve essere chiusa (e cosi alla successiva richiesta ne viene generata una nuova) e quando fare le transazioni.

Tutti i repository sono solitamente singleton, dato che quello che cambia nel loro "contesto" è il sessionfactory che semplicemente restituisce la sessione attualmente nel "contesto". Chiaramente non è tutto facile, :) ma in generale questo approccio mi semplifica la vita perchè a quel punto l'unico dato realmente importante è la sessione che viene gestita da un gestore centralizzato e quindi i repository sono piuttosto semplici.

Ad esempio in MVVM e WPF potresti fare in modo che la sessione shari la sua vita con il ViewModel.

Alk.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao andysal,

andysal wrote:
> 'giorno Petrux, prova a dare una occhiata agli ultimi changeset di NSK,
> perchè credo che troverai risposta ad alcune delle tue domande :-)

Fatto. Risposte trovate quasi integralmente in meno di un secondo. :-)
Ora, spulciando meglio lo strato di business cercherò di trovare anche
le altre. ù

Ciao e grazie,
petrux

--
  • | Punteggio Post: 5
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao alk,

alkampfer wrote:
> Sostanzialmente spesso adotto un approccio di questo tipo.

Innanzitutto ti ringrazio perché la spiegazione che mi hai data
(corroborata dall'esempio di NSK) è decisamente interessante.

> Usando
> Nhibernate il repository si appoggia semplicemente a nhibernate per la
> persistenza, ma in generale se non hai nhibernate è il repository che
> dialoga con il DAL.con Castle.nhibernate facility inietto il
> sessionManager nel repository, cosi il repository quando deve accedere
> al DAL prende la session corrente e fa quello che deve fare.

Uhm... in uno scenario O/RM independent, avrebbe senso astrarre il data
context in una interfaccia IDataContext e iniettare quella nel
repository? Oppure conviene astrarre il repository e implementarlo in
maniera O/RM dependent?

> Per le transazioni dipende dall'ambiente, in asp.net si gestisce il
> tutto con un httpmodule.

Che significa?

> Alla prima creazione della sessione il
> sessionmanager crea la sessione ed inizia una transazione, e nell'end
> request ed error si committa o si rollbacka. In alcuni progetti ho dei
> gestori di sessione sulla falsariga di quelli di castle, in sostanza si
> occupano di capire quando la sessione deve essere chiusa (e cosi alla
> successiva richiesta ne viene generata una nuova) e quando fare le
> transazioni.

Uhm... anche qui c'è un po' di oscurità... :-)

> Tutti i repository sono solitamente singleton, dato che quello che
> cambia nel loro "contesto" è il sessionfactory che semplicemente
> restituisce la sessione attualmente nel "contesto". Chiaramente non è
> tutto facile, :) ma in generale questo approccio mi semplifica la vita
> perchè a quel punto l'unico dato realmente importante è la sessione che
> viene gestita da un gestore centralizzato e quindi i repository sono
> piuttosto semplici.

Ok, got it. Permettimi però di ragionarci un po' su (anche se confesso
di avere in testa l'implementazione per EF in NSK quindi il mio
ragionamento potrebbe essere un po' "polarizzato"). In primo luogo, se
il repository è un singleton e questo tiene in sé la sessione, chi si
occupa di cambiarla una volta che questa è stata disposed? In NSK ho:

public class Repository : blablabla
{
public Repository(NorthwindContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
}
}

dove NorthwindContext estende ObjectContext. Ora, l'utilizzo tipico
dovrebbe essere (AFAIK):

using ([IL MIO DATA CONTEXT])
{
//blablabla
[IL MIO D.C.].Commit();
}

Ovviamente se uso il repository questo non mi serve, ma chi si occupa
allora di decidere quando si committa (o quando si fa il rollback in
caso di un eccezione, che con la 'using' mi viene gratis)?

> Ad esempio in MVVM e WPF potresti fare in modo che la sessione shari la
> sua vita con il ViewModel.

In che senso?

Ciao e grazie,
petrux

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

Ogni volta che usi un ORM, il ciclo di vita della Sessione è fondamentale. In un MVVM puoi fare si che ogni View Model abbia la sua sessione, e che venga distrutta solamente quando il ViewModel venga disposato. In questo modo ad esempio gli oggetti caricati possono avvantaggiarsi del lazy load durante il binding (anche se questa non è l'opzione che preferisco)

Alk.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907

Ciao Alk,

Gian Maria Ricci:

Ogni volta che usi un ORM, il ciclo di vita della Sessione è fondamentale. In un MVVM puoi fare si che ogni View Model abbia la sua sessione, e che venga distrutta solamente quando il ViewModel venga disposato. In questo modo ad esempio gli oggetti caricati possono avvantaggiarsi del lazy load durante il binding (anche se questa non è l'opzione che preferisco)

 

A occhio ti direi che ho capito. Aspetto lunedì per un esempio hands-on. :-)

 

Ciao,

Giulio

 

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

In questo periodo sono veramente "incasinato" per molti motivi :( per cui non riesco a preparare un esempietto, ma prometto che appena ho tempo lo faccio perchè stamattina un altro collega mi ha fatto una domanda simile :) per cui prima o poi mi servirà avere un po di codice stupido da fare vedere.

alk.

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
alkampfer wrote:
> In questo periodo sono veramente "incasinato" per molti motivi :( per
> cui non riesco a preparare un esempietto, ma prometto che appena ho
> tempo lo faccio perchè stamattina un altro collega mi ha fatto una
> domanda simile :) per cui prima o poi mi servirà avere un po di codice
> stupido da fare vedere.

No, non chiedevo un esemio "ad hoc", solo che ero a casa dove ho solo
macchine Linux, quindi era *impossibile* verificare al volo. :-)
Comunque ogni esempio ulteriore è bene accetto!

Grazie,
petrux
--
  • | Punteggio Post: 5
Pagina 1 di 2 (28 elementi) 1 2 Avanti > | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems