Web Congress 3.0: Entity Framework 4.0 vs NHibernate, slide e codice

datesabato 17 aprile 2010 alle 9.28  - posted by Manuel Scapolan in NHibernate | Entity Framework | Eventi

web congress 1nn0vaVenerdì 16 aprile si è svolto a Pordenone l'evento più importante dell'anno organizzato da 1nn0va sulle tecnologie web.
Quest'anno ho avuto l'onore di farne parte come speaker presentando una sessione sull'accesso ai dati via ORM (Object-Relational Mapping) in un paragone tra il veterano NHibernate ed il promettente Entity Framework 4.0 di Microsoft.

Devo dire che Microsoft ha fatto un gran lavoro per colmare il gap che esisteva tra la prima versione dell'Entity Framework e gli altri protagonisti del settore. Una delle caratteristiche più apprezzate della nuova release è la possibilità ora concreta di utilizzare le proprie classi di dominio senza dover necessariamente ereditare dalla classe base EntityObject. La cosa si fa poi ancora più interessante se sfruttiamo il nuovo sistema di template (T4) che ci permette di generare automaticamente dall'Entity Data model (EDM) le classi di dominio in "modalità" POCO (Plain Old CLR Object).

Per chi fosse interessato in fondo al post trova i link per scaricare le slide e la solution di Visual Studio 2010 con tutto il codice sorgente.

L'applicazione di esempio è un semplice blog engine sviluppato in ASP.NET MVC 2.0 con l'obiettivo di separare per quanto possibile la logica di business dalla presentation e dall'accesso ai dati.

web congress 1nn0va solution L'architettura è a quattro livelli ed in particolare:
  • SampleBlog.Web: progetto di tipo ASP.NET MVC 2.0 ovvero il livello di presentazione dei dati
  • SampleBlog.Model: progetto che astrae la parte Model dell'MVC per slegare la logica di dominio dalla presentazione e che contiene le nostre classi POCO
  • SampleBlog.AppServices un Service-Layer che qui gioca un po' il ruolo del Repository
  • SampleBlog.CommonPersistence: uno dei tre livelli di persistenza, utilizza ADO.NET "Legacy" quindi SqlCommand, SqlDataReader e stored procedure
  • SampleBlog.NHibernatePersistence: utilizza NHibernate e un mapping su file xml
  • SampleBlog.EntityFrameworkPersistence: utilizza Entity Framework però in versione "Persistence Ignorance", ovvero mappato sulle classi POCO del nostro modello

Il tutto condito con Windsor il framework IoC di Castle Project che permette di scegliere di volta in volta quale progetto di persistenza usare.

Ricordo comunque che l'applicazione è stata realizzata esclusivamente con l'ottica di mostrare l'accesso ai dati tramite Entity Framework ed NHibernate in contrapposizione a quello che normalmente si fa con ADO.NET "Classic", non prendetela quindi come esempio di architettura a quattro livelli.

 

Slide e codice dell'evento disponibili per il download:

Eseguire dei filtri nei file xml di mapping in NHibernate con la proprietà where

datevenerdì 6 novembre 2009 alle 23.27  - posted by Manuel Scapolan in NHibernate

Immaginiamo di avere una collection di oggetti mappati con un bag in NHibernate e di volerli ottenere già filtrati dal database per una particolare condizione. Sembrerebbe un lavoro da where ed infatti non a caso sfogliando tra gli attributi dell'elemento bag troviamo proprio l'attributo where, ma vediamo in un esempio come utilizzarlo:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Category" table="Categories">
  ...     
  <bag name="Children" lazy="true" where="IsActive='true'">
     <key foreign-key="FK_Categories_Categories">
        <column name="ParentCategoryID" length="4" />
     </key>
     <one-to-many class="Category" not-found="ignore" />
  </bag>
  </class>
</hibernate-mapping>

tagsTags:

Come indicizzare una proprietà di un tipo non primitivo in Lucene.Net con un FieldBridge di NHibernate.Search

datedomenica 25 ottobre 2009 alle 21.02  - posted by Manuel Scapolan in NHibernate | Lucene.NET

Può essere utile a volte indicizzare con Lucene.Net una proprietà di un oggetto che non sia una stringa o un tipo primitivo, pensiamo ad esempio alla lista di categorie di un prodotto. Per casi come questo e laddove l'accesso ai dati viene fatto con NHibernate posso raggiungere il risultato desiderato utilizzando un FieldBridge di NHibernate.Search ed un po' di reflection:

public class PropertyBridge 
      : ITwoWayStringBridge, IParameterizedBridge
{
  private Type _type;
  private string _propertyName;
  
  public string ObjectToString(object obj)
  {
    StringBuilder sb = new StringBuilder();
    PropertyReflector pr = new PropertyReflector();
    if (obj.GetType().IsGenericType && 
      typeof(PersistentGenericBag<>).IsAssignableFrom(
          obj.GetType().GetGenericTypeDefinition()))
    {
      IEnumerable enumerable = obj as IEnumerable;
      if (enumerable != null)
      {
        IEnumerator enumerator = enumerable.GetEnumerator();
  
        while (enumerator.MoveNext())
        {
          object current = enumerator.Current;
          if(current!=null)
          {
            sb.Append(pr.GetValue(current,_propertyName) + " ");
          }
        }
        return sb.ToString();
      }
    }
    else
    {
      sb.Append(pr.GetValue(obj,_propertyName));
    }
    return sb.ToString();
  }
  
  public void SetParameterValues(object[] parameters)
  {
    Object classType = parameters[0];
    if (classType != null)
      this._type = (Type)classType;
    _propertyName = parameters[1].ToString();
  }
 
  public object StringToObject(string stringValue)
  {
    throw new NotImplementedException();
  }
}

Il FieldBridge permette a NHibernate.Search di indicizzare con Lucene il contenuto di una proprietà qualora non fosse coerente utilizzare il metodo ToString() (quasi mai per i tipi non primitivi). Analizzando il codice sopra riportato si può notare come vengano passati al FieldBridge due parametri: il tipo di oggetto ed il nome della proprietà da indicizzare (righe 38-44). Con questi due parametri ed utilizzando l'utility PropertyReflector (classe di utilità scritta da Guy Mahieu per fare "deep-reflection" di proprietà) viene recuperato il valore da salvare nell'indice di Lucene. Il FieldBridge in oggetto riesce ad indicizzare sia oggetti singoli (righe 31-34) sia collezioni verificandone il tipo ed utilizzando l'interfaccia IEnumerator (righe 11-30). Qui sotto possiamo notare l'utilizzo dell'attributo per una proprietà di tipo IList<T>.

[FieldBridge(typeof(PropertyBridge), 
    new object[] { typeof(Category), "CategoryID" })]
public virtual IList<Category> Categories { get; set; }

Nota: il PropertyBridge visto in questo esempio nasce da una esigenza specifica e per questo motivo non ricopre tutte le casistiche possibili.

Could not find dialect in configuration

datedomenica 23 novembre 2008 alle 23.50  - posted by Manuel Scapolan in Castle Project | NHibernate

In questi giorni ho avuto l'occasione di utilizzare l'ultima build di Castle Project. Utilizzando ActiveRecord mi sono però scontrato con il seguente errore di configurazione: "Could not find the dialect in configuration". Il problema è dovuto ad un cambiamento nei nomi delle proprietà di configurazione di NHibernate, infatti se vogliamo utilizzare Castle ActiveRecord nell'ultima build compatibile con NHibernate 2.0 dobbiamo togliere dal nome delle proprietà di configurazione il prefisso hibernate, come mostrato qui sotto:

<activeRecord isWeb="true">
  <config>
    <add key="connection.driver_class" 
      value="NHibernate.Driver.SqlClientDriver"/>
    <add key="dialect" 
      value="NHibernate.Dialect.MsSql2005Dialect"/>
    <add key="connection.provider" 
      value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="connection.connection_string" 
        value="Data Source=.;Initial Catalog=..."/>
  </config>
</activeRecord>

About me

manuel scapolanSono un consulente informatico. Nel 2004 terminati gli studi in Ingegneria Informatica (1° livello), ho iniziato come freelance collaborando con una ditta di consulenza informatica ed una agenzia di marketing e comunicazione nello sviluppo di applicazioni web. Attualmente divido il lavoro di sviluppatore e progettista web con attività di formazione nel settore della programmazione.
View Manuel Scapolan's profile on LinkedIn

Follow me on Follow manuelscapolan on Twitter

Calendario


<<  agosto 2010  >>
lumamegivesado
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

Disclaimer

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati mediante:
creative commons
Attribuzione: Non commerciale
Condividi allo stesso modo. R.2.5

Books (a bit more about my library)

Domain Driven Design - Eric Evans Applying Domain-Driven Design and Patterns - Jimmy Nilsson Refactoring to Patterns - Joshua Kerievsky Design Patterns -  Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides Code Complete Second Edition - Steve McConnell Patterns of Enterprise Application Architecture - Martin Fowler Agile Principles, Patterns, and Practices in C# - Robert C. Martin xUnit Test Patterns - Gerard Meszaros Refactoring - Martin Fowler CLR via C# Second Edition - Jeffrey Richter Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries - Krzysztof Cwalina, Brad Abrams Don't make me think! - Steve Krug Bulletproof Ajax - Jeremy Keith

Manuel Scapolan Copyright © 2007 - 2010 - Tutti i diritti riservati - Powered by BlogEngine.NET 1.5.0.7 - silk icons by famfamfam - Time CET