Archive for the ‘.Net’ Category

Logging mit Log4Net

Sonntag, Oktober 11th, 2009

Ich weiß, es gibt viele Artikel über das Loggen mit Log4Net. :-)
Trotzdem werde ich anhand eines Beispiels das Loggen mit Log4Net zeigen.

Als erstes schauen wir uns die Konfigurations-Datei an.

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <configuration>

   3:   

   4:   <configSections>

   5:     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

   6:   </configSections>

   7:   

   8:   <log4net>

   9:     <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">

  10:       <file value="loglog-file" />

  11:       <appendToFile value="true" />

  12:       <rollingStyle value="Date" />

  13:       <datePattern value="yyyyMMdd" />

  14:       

  15:       <layout type="log4net.Layout.PatternLayout">

  16:         <conversionPattern value="%date [%thread] %-5level %logger [%property{Session}] - %message%newline" />

  17:       </layout>

  18:     </appender>

  19:     

  20:     <root>

  21:       <level value="ALL" />

  22:       <appender-ref ref="FileAppender" />

  23:     </root>

  24:   </log4net>

  25:   

  26: </configuration>

Appender:

Ich verwende hier den RollingFileAppender, dieser kann nach Größe und Datum eingeschränkt werden. Ist die Größe erreicht bzw. hat sich das Datum geändert, wird eine neue Log-Datei angelegt.  In dem Beispiel werden die Log-Files in einem Unterverzeichnis “log”

[file value=log\log-file”] im Programmverzeichnis abgelegt. Mit rollingStyle lege ich fest wann eine neue Datei erstellt werden soll. Hier wird jeden Tag eine Log-File erstellt. Festgelegt wird das mit dem datePattern.

Weitere Appender sind hier nachschlagbar.

Layout:

Für das Layout verwende ich das Patternlayout, ein flexibles konfigurierbares Layout. Weitere Layouts gibt es hier.

Unter conversationPattern kann die Ausgabe definiert werden. Welche Möglichkeiten für die Ausgabe vorhanden sind, findet man hier.

Im letzten Abschnitt wird bestimmt wie und was geloggt werden soll. Folgende Level-Stufen sind verfügbar:

- Off

- Fatal

- Error

- Warn

- Info

- Debug

- All

Mit appender-ref wird der oben definierte Appender verwendet. Es können natürlich mehrere Appender definiert werden.

Verwendung im Code:

   1: static void Main()

   2: {

   3:     log4net.Config.XmlConfigurator.Configure(new FileInfo("logging.config"));

   4:     ILog logger = LogManager.GetLogger(typeof(Program));

   5:      

   6:     logger.Info("Info");

   7:     logger.Debug("Debug");

   8:     logger.Error("Error");

   9:     logger.Fatal("Fatal");

  10:     logger.Warn("Warn");

  11: }

In der dritten Zeile wird log4net konfiguriert, hierfür geben wir die “Config-Datei” an. Eine Zeile weiter wird der Logger geholt. Für jedes Level gibt es eine Methode.

Level:

Vielleicht sollte noch die Hierarchie verschiedener Levels erwähnt werden.

Info

   1: 2009-10-11 18:36:32,305 [10] INFO  WindowsFormsApplication1.Program [(null)] - Info

   2: 2009-10-11 18:36:32,339 [10] ERROR WindowsFormsApplication1.Program [(null)] - Error

   3: 2009-10-11 18:36:32,340 [10] FATAL WindowsFormsApplication1.Program [(null)] - Fatal

   4: 2009-10-11 18:36:32,340 [10] WARN  WindowsFormsApplication1.Program [(null)] - Warn

Debug

   1: 2009-10-11 18:37:23,195 [9] INFO  WindowsFormsApplication1.Program [(null)] - Info

   2: 2009-10-11 18:37:23,228 [9] DEBUG WindowsFormsApplication1.Program [(null)] - Debug

   3: 2009-10-11 18:37:23,228 [9] ERROR WindowsFormsApplication1.Program [(null)] - Error

   4: 2009-10-11 18:37:23,228 [9] FATAL WindowsFormsApplication1.Program [(null)] - Fatal

   5: 2009-10-11 18:37:23,228 [9] WARN  WindowsFormsApplication1.Program [(null)] - Warn

Error

   1: 2009-10-11 18:37:44,140 [9] ERROR WindowsFormsApplication1.Program [(null)] - Error

   2: 2009-10-11 18:37:44,173 [9] FATAL WindowsFormsApplication1.Program [(null)] - Fatal

Anhand der Beispiele kann man erkennen, dass nicht nur das eingestellt Level geloggt, sondern hierarchisch vorgegangen wird.

Fazit:

Log4Net ist einfach und schnell einzusetzen. Durch die riesige Auswahl an Möglichkeiten des Loggings ist sicherlich für jeden was dabei.

Viel Spaß beim Loggen! :-)

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

Blog-Parade: Die 3 beliebtesten Fachbücher aus dem .NET-Umfeld

Mittwoch, September 16th, 2009

Wolfgang Kluge hat eine neue Blog-Parade gestartet. 
Über seinen Blog sucht er die beliebtesten Fachbücher aus dem .Net-Umfeld. Ich hab hier meine 3 Favoriten zusammengestellt.

1. Agile Principles, Patterns and Practices in C# [Robert C. Martin und Micah Martin]

AgileIn dem Buch geht es um die agile Software-Entwicklung mit verschiedenen Principles (SRP, OCP, LSP, DIP, usw.).
Des weiteren werden die Vorteile von agilen Arbeitstechniken, z.B. Pair-Programming, beschrieben.
Alle Beispiele in C# sind strukturiert und werden dem Leser einfach übermittelt.

 

2. Clean Code [Robert C. Martin]

CleanCodeRefactoring, Patterns, Testen und Techniken für sauberen Code in einem gut und ausführlich geschriebenen Buch.  Ein muss für jeden Clean-Code-Developer.

 

 

 

3. Refactoring [Martin Fowler]

Refactoring

Verbessern Sie Ihren Code! – so die Einleitung von Martin Fowler. Refactoring ist schon lang nicht mehr nur für “Refactoring-Experten” gedacht, sondern jeder Entwickler muss dazu angehalten werden sauberen Code zu hinterlassen.

 

 

 

Das waren meine 3 Bücher, wobei es noch weitere im Repertoire gibt, z.B “DDD” von Eric Evens.

WPF MVVM – Kleines Testprojekt [Teil 1]

Dienstag, August 4th, 2009

Ich arbeite derzeit an einem kleinen “Spielprojekt” in WPF mit dem MVVM Pattern.
Für mich ist das der optimale Einstieg in WPF. Das Projekt ist klein, überschaubar und soll natürlich auch noch getestet sein. Das Projekt wird für einen 60. Geburtstag eingesetzt, also reines Vergnügen mit Weiterbildungsfaktor.

Folgende Aufgabenstellung (erinnert an “Wer wird Millionär”):

Ein Kandidat muss zehn Fragen zu einer bestimmten Person beantworten. Je Frage stehen 3 oder 4 Antworten zur Verfügung. Wurde eine Frage beantwortet, darf der Kandidat die nächste beantworten. Die Fragen sind wie bei WWM nach Schwierigkeitsstufen kategorisiert. Je mehr Fragen beantwortet wurden, desto schwerer die Fragenstellung. Fragen können nicht nur aus Textbausteine bestehen, sondern zusätzlich auch aus Videos oder Bildern.

Soweit die Aufgabenstellung, danach stellte sich die Frage, wie setze ich das Projekt um?
Da ich mich schon seit längerem für WPF interessiere, werde ich das Spiel in WPF mit dem MVVM Pattern versuchen umzusetzen.

Anfang:

Als erstes hab ich mir das WPF Model-View-ViewModel Toolkit von dieser Seite geladen. (geht auch ohne)
Das Toolkit beinhaltet folgendes:

  • Template
  • Dokumentation (unbedingt lesen)
  • Demo

Die Installation dauert nicht lange und braucht hier nicht länger erklärt zu werden. 

Das Template fügt sich wie in Abb. 1 in VS2008 ein.
VS2008_Template
(Abb. 1)

Anlegen eines neuen Projekts:

Nach dem ich das Template ausgewählt habe, gibt es die Möglichkeit automatisch ein Unit-Test-Projekt (Abb. 2) anzulegen. Da ich das Projekt manuell anlege, hab ich die Nachfrage verneint.
TestProject
(Abb. 2)

Nach der Erstellung des Projekts wird folgende Struktur angelegt.
image
(Abb. 3)

Zu den einzelnen Klassen mehr dazu im nächsten Blogeintrag.

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

Hibernate

Sonntag, Juli 27th, 2008

Da ich lieber in Büchern lese, als im Internet gesammelte Werke, hab ich ein Buch über NHibernate gesucht.
Allerdings ist es nicht einfach ein Buch über NHibernate zu finden, deswegen hab ich mir folgendes über "Hibernate" angesehen:

Hibernate - Das Praxisbuch für Entwickler von Sebastian Hennebrüder.

Am Anfang war ich mir nicht sicher ob das Buch überhaupt das "Richtige" für mich ist, immerhin arbeite ich mit C# und NHibernate.

Zu Ende gelesen muss ich feststellen, es ist auch für NHibernate - Benutzer  wertvoll.

Eigentlich wollte ich mehr über XML-Mappings erfahren, z.B. Anwendungen, Möglichkeiten usw.
Bis ich auf den Satz "… XML-Mappings werden hier nicht behandelt …" gestoßen bin.

Ärgerlich dachte ich mir, aber es werden alle Beispiele auch mit XML-Mappings dargestellt. :-)

Was bietet das Buch?

  • Grundlagen Hibernate (zum größten Teil übertragbar auf NHibernate)
  • Praxisbeispiele
  • Best Practices

Auch wenn die Beispiele in Java geschrieben wurden, kann man diese schnell nachvollziehen.

Für mich hat sich der Kauf des Buches auf jeden Fall gelohnt, außerdem kann man es als Nachschlagewerk verwenden.

Wer allerdings Informationen über ein NHibernate-Buch besitzt, nur her damit…

Agile Softwareentwicklung

Donnerstag, Juli 24th, 2008

Es ist endlich angekommen…
Ich hab mir folgendes Buch von Robert C. Martin und Micah Martin geleistet.

image

Evtl. werde ich hier einige Einträge über das Buch schreiben.