Archive for the ‘FluentNHibernate’ Category

NHibernate – typisierte Liste in ein DTO wandeln

Montag, September 28th, 2009

Wie kann man ganz einfach eine generische Liste in ein “generisches DTO” wandeln? Diese Frage stellten wir uns letztens in der Arbeit. Nach mehreren Codezeilen um die generische Liste (manuell) zu mappen, waren wir der Meinung, dass es doch einfacher zu handhaben sein muss.
Nach einer längeren Recherche sind wir dann auf Transformers.AliasToBean gestoßen. Anbei ein kleines Beispiel für die Anwendung von Transformers.AliasToBean.

So könnte die Klasse “Auflage” aussehen:

image

Das dazugehörige DTO:

image

Da ich Fluent-NHibernate verwende, wird die Klasse wie folgt gemappt:

   1: public class AuflagenMap : ClassMap<Auflage>

   2: {

   3:     public AuflagenMap(){

   4:         Id(x => x.Id);

   5:         Map(x => x.Datum);

   6:         Map(x => x.Anzahl);

   7:     }

   8: }


Mit Projections.Sum(“Anzahl”).As(“Auflage”) wird bestimmt wohin gemappt werden soll. “Anzahl” kommt aus “Auflage” und wird per Alias (“.As”) in das Property “Auflage gemappt. Das gleiche gilt natürlich auch für die Gruppierung nach Datum.

   1: public IEnumerable<AuflageDto> AuflagenSummierung(){    

   2:     var criteria = m_Session.CreateCriteria(typeof (Auflage))

   3:         .SetProjection(Projections.ProjectionList()

   4:             .Add(Projections.Sum("Anzahl").As("Auflage"))

   5:             .Add(Projections.GroupProperty("Datum").As("Datum")))

   6:         .AddOrder(Order.Asc("Datum"))

   7:         .SetResultTransformer(Transformers.AliasToBean(typeof (AuflageDto)))

   8:         .List<AuflageDto>();

   9:     return criteria;

  10: }

Das Ergebnis sieht dann so aus:

image

Ist das so einfach?

Sonntag, April 19th, 2009

Ich beschäftige mich im Moment ein bisschen mit FluentNHibernate.
Das erste was ich mir angesehen habe, war die Testbarkeit.
Ich bin überrascht, kann es manchmal wirklich  so einfach sein?
Ein kleines Beispiel (nicht vollständig) anbei.

Benutzer:

1 public class BenutzerMap : ClassMap<Benutzer> 2 { 3 public BenutzerMap() 4 { 5 Id(x => x.Id); 6 Map(x => x.Vorname); 7 Map(x => x.Nachname); 8 } 9 }

Test:

1 [Test] 2 public void TestMapBenutzer() 3 { 4 new PersistenceSpecification<Benutzer>(m_Session) 5 .CheckProperty(c => c.Nachname, "Mustermann") 6 .CheckProperty(c => c.Vorname, "Max") 7 .VerifyTheMappings(); 8 }

Was passiert beim Test:

  • es wird eine Benutzer-Instanz erstellt
  • der Benutzer wird in der Datenbank/Tabelle angelegt
  • der gespeicherte Benutzer wird in eine neue Instanz geladen
  • die neue Instanz wird mit dem Original verglichen