ORM con gli..."attributi"

Si avvicina il meeting nelle marche e c'è ancora qualcuno che non crede che ci saranno le pallavoliste svedesi. Invece viassicuro che io e il crad ve le faremo realmente vedere.

Stavamo pensando di presentare un modello di dominio che funzionasse con NHibernate sia con il file di mapping, sia con gli attributi. L'idea mi era già venuta per il meeting in veneto, ma poi alla fine non ci sono arrivato con i tempi.

in NH infatti si può scrive allo stesso modo sia questo:

public class Persona
{
   public string Nominativo;
}

<class name="Persona" table="Persona">
   <property name="Nominativo"/>
</class>


che questo:

[Class]
public class Persona
{
    [Property]
    public string Nominativo;
}


Qualche considerazione non indifferente

  1. Pensiamo ad un Domain Model su un assembly separato rispetto ad un data layer e al Presentation. Decorare con attributi mi impone il fatto di referenziare nell'assembly di Dominio gli assembly del mio ORM. 
    Poco Elegante.
  2. Se dovessi scrivere delle estensioni del mio ORM, (un custom type persister o un custom entity persister) il posto più giusto dove metterlo sarebbe dunque l'assembly del mio DAL. Ma per usare le estensioni, gli attributi dovrebbero in qualche modo dichiararli/definirli. Il che mi imporrebbe di referenziare nel Domain Model anche il DAL stesso!....anatema! una bella referenza circolare. Ci vorrebbe un altro assembly solo per le estensioni.
    Patetico.
  3. Non è necessariamente vero che una classe decorata abbia il limite di essere mappata 1 a 1 con una tabella. Dipende dall'ORM. NHibernate e molti altri non hanno questo limite, lo aveva invece DLinq nelle prime versioni (ma la cosa sembra prendere una piega diversa).
    Indifferrente
  4. Con attributi, una qualsiasi modifica alla struttura del db da riproporre sulla configurazione impone la ricompilazione. Il cambio del file di configurazione impone la ricostruzione della factory, quindi al massimo un riavvio dell'applicazione in produzione. E' una possibilità in piu non avere gli attributi...ma è anche vero che una modifica di un DB se avviene per un cambio di requisito (aggiunta di nuove colonne o altro) imporrebbe cmq del codice nuovo.
    Comodo.
  5. Informazioni di mappatura tramite attributi, immerse nelle classi di dominio, non mi permettono di usare il dominio, trasversalmente con DAL diversi (magari su DB diversi e Schema diversi).
    Limitante


In pratica non li uso mai, in modo da lasciare il domain layer libero da reference del mio ORM o da informazioni di persistenza di alcun tipo. 

In pratica: un developer con...gli "attributi"...non userebbe mai gli "attributi" con un ORM!...:-)
(ha fatto la battutaaaa....)

Ma se qualcuno su progetti piccoli si vuole fermare alla comodità di mettere attributi piuttosto che scrivere un xml, lo lasceremo d'esempio. Ma anche a quelli mi rivolgo....ma non avete visto NHDomainMapper? :-) 
XML generato al volo, interfaccia grafica con approccio Topdown puro...ect...etc...

NHDomainMapper è l'unico che può battere Chuck Norris.

Print | posted on lunedì 27 novembre 2006 9.51

Feedback

# re: ORM con gli...&quot;attributi&quot;

left by Marco De Sanctis at 27/11/2006 10.16 Gravatar
Aggiungo:
l'esempio di giancarlo è volutamente rivolto ad un caso SEMPLICE, in cui classe e property hanno il medesimo nome su dominio e su DB. E senza specificare nessun parametro opzionale.

Altrimenti il tutto diviene
[Class(Table="....", Lazy=false, ....)]

Altro aspetto: con gli attributi non si possono rappresentare strutture gerarchiche, quindi la semantica è intrinsecamente limitata.

Nel caso di NHibernate, gli autori del progetto NHibernate.Mapping.Attributes, per risolvere il problema, si sono inventati una sintassi ad indici del tipo:

[Id(-3, .....)]
[Generator(-2, -----)]
[Param(-1, ....)]
[Param(-1, ....)]
public int Id
{....}

che personalmente trovo molto più scomoda e innaturale dell'XML.

Quindi, ne vale veramente la pena?

# re: ORM con gli...&quot;attributi&quot;

left by Giancarlo Sudano at 27/11/2006 10.19 Gravatar
Il buon Adrian, tempo fa ci fece sapere che l'ordine degli attributi non è rispettato in c# e vb.net....ma lo è in j#...confermi Adrian?
Quindi per non avere problemi con la gerarchia...programmate in j# ....huahuahua...

# re: ORM con gli...&quot;attributi&quot;

left by Fabio Cozzolino at 27/11/2006 10.20 Gravatar
> NHDomainMapper è l'unico che può battere Chuck Norris

... l'importante è che Chuck Norris non può uccidere SOA :P
http://www.dotnetside.org/blogs/fabio/archive/2006/11/15/On-the-eigth-day_2C00_-God-created-SOA_2C00_-then-SOA-created-Rock-and-Roll.aspx

Quasi quasi faccio un salto nelle marche per vedere le pallavoliste svedesi :D :D

# re: ORM con gli...&quot;attributi&quot;

left by Andrea Saltarello at 27/11/2006 10.21 Gravatar
Toh! Hai fatto un riassunto del packaging scelto da 2 anni per NSK <g>

# re: ORM con gli...&quot;attributi&quot;

left by Giancarlo Sudano at 27/11/2006 10.26 Gravatar
@Andrea...
Come diceva Corrado al workshop...
Mica siamo qui a giocare con le bamboline...
(ricordo bene?)
:-)

# re: ORM con gli...&quot;attributi&quot;

left by Stefano Ottaviani at 27/11/2006 10.48 Gravatar
E se anche non ci fossero le pallavoliste svedesi, ci sono sempre le amiche della moglie di Simone, no :P?

# Re: ORM con gli..."attributi"

left by Igor Damiani at 27/11/2006 11.05 Gravatar
come dicevamo ieri....

public WomanCollection Get()
{
ChiarettaSimone piyo = new ChiarettaSimone();
Woman piyoWife = piyo.Wife;

WomanCollection ret = piyoWife.GetFriends(Gender.Female);
return(ret);
}

# re: ORM con gli...&quot;attributi&quot;

left by Massimo Iacolare at 27/11/2006 11.07 Gravatar
A parziale difesa degli attributi c'è il fatto che supportano meglio il refactoring di una classe di dominio.

Significa che se cambio il nome di una classe o di una proprietà con un tool come Resharper non devo andare nell'xml.

Direi comodo...

# re: ORM con gli...&quot;attributi&quot;

left by Giancarlo Sudano at 27/11/2006 11.12 Gravatar
Massimo il tuo commento è ottimo.
Mi fa piacere che il post serva come spunto di discussione.
Grazie!
Direi comodo anch'io!

# re: ORM con gli...&quot;attributi&quot;

left by Claudio Maccari at 27/11/2006 14.00 Gravatar
Concordo con Massimo sul problema refactoring & file di mapping. La soluzione per me è sempre e comunque Unit test

Per i piccoli progetti perferisco Castle ActiveRecord (quindi attributi) ad NHibernate perchè + sbrigativo

# re: ORM con gli...&quot;attributi&quot;

left by Giancarlo Sudano at 27/11/2006 14.22 Gravatar
@ Claudio
I test non sono la "soluzione" al problema di qualche configurazione scegliere (xml o tag).
Sono trasversali.
Concordo in ogni caso sul fatto di utilizzarli cmq.

Usare ActiveRecord o NHibernate significa usare cmq NHibernate sotto...:-)

La scelta più che altro la farei in base al tipo di entity (ActiveRecord o Domain Model) che userò nell'applicativo e non alla quantità.

# Re: ORM con gli..."attributi"

left by Tommaso Caldarola at 27/11/2006 15.20 Gravatar
Assolutamente d'accordo. Sono a quota 285 entità (e non è ancora completo il DomainModel), e sin dall'inizio ho preferito adottare xml e non attributi....
Io aborro gli attributi... non mi permetterebbero di gestire l'accoppiata generazione / personalizzazione senza ricompilazione.
Comments have been closed on this topic.