Globale Namespaces für die Razor-Syntax und den ASP.NET WebPages

Wenn man bei WebForms nicht auf jeder Page oder jedem UserControl die notwendigen Namespace importieren möchte. So hat man diese in der Web.config hinterlegt.

Dies funktioniert wunderbar bei WebForms und der WebForm-ViewEngine unter ASP.NET MVC.

Mit den neuen WebPages (.cshtml) und der Razor-Syntax kann man mit

@using Regularly.Models
@using Regulary.Areas.Administration.Models

auch entsprechende Namespaces der Template bekannt machen, Jedoch funktioniert der Weg über die web.config nicht (ob sich dies ändert steht wohl nicht nicht fest).

Aber man einen anderen Weg gehen, dazu muss man beim Application-Start über die Klasse CodeGeneratorSettings die Namespaces hinzufügen.

CodeGeneratorSettings.AddGlobalImport("Regularly.Models");
CodeGeneratorSettings.AddGlobalImport("Regularly.Extensions");

Diese Klasse befindet sich im Namespace Microsoft.WebPages.Compilation


Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Neue Informationen hier im Blog

Da ich hier und da Anfragen nach Vorträgen bekomme habe ich hier im Blog nun angefangen die Vorträge die ich halte zu hinterlegen. Diese Liste wird mit der Zeit erweitert.

Firmen und User Groups können bei mir für einen Vortrag vor Ort anfragen.

 

Technorati Tags: ,,,

Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Eigene Namensregeln in ReSharper für xUnit.NET basierte Tests

Ich habe heute ein PlugIn für ReSharper veröffentlicht, mit dem möglich ist spezielle Naming-Styles in ReSharper für xUnit.NET und xUnitBDDExtensions basierte Unit Test festzulegen.

Im readme.txt ist erklärt wie man es installiert. Hier ein paar Screenshots zur Verwendung im ReSharper.

ReSharper-Options-NamingStyle

Dort nun Advanced Settings anklicken.

ReSharper-Options-Advande-Naming-Settings

Nun eine eigene Naming Rule hinzufügen. z.B. BDD Style und folgendes

auswählen.

ReSharper-Options-NamingStyle-BDD


Das war’s dann schon. Viel Spaß.

Hier geht’s zur Projekt Seite auf GitHub

 


Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Git mit farbiger Darstellung in der PowerShell und beim Command Prompt

Git unterstützt die farbige Ausgabe seiner Meldungen, dies macht es um einiges einfacher über die Shell zu bedienen. In der Standard-Konfiguration macht Git dies automatisch bei allen Ausgabegeräten die sich als Terminal ausgeben. So steht’s in der Dokumentation.

Leider machen dies wohl weder die PowerShell noch der Command Prompt von Windows. Möchte man trotzdem Farben in der Ausgabe haben, so muss man Git überreden dies zu machen. Am einfachsten geht in dem man die Shell seines Vertrauens öffnet und folgendes eingibt.

 git config --global color.ui always

Damit wird in der globalen .gitconfig die Farbausgabe in allen Bereichen bei denen Git dies unterstützt aktiviert.

Möchte man dies ein wenig granularer haben, so kann man dies auch für einzelne Teile aktivieren oder deaktivieren.

Details dazu stehen in der Dokumentation.

http://www.kernel.org/pub/software/scm/git/docs/v1.7.1/git-config.html

Sucht dort einfach nach color.branch, ab da findet Ihr die möglichen Variationen.

 

Technorati Tags: ,,,,

Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Schreibt über die dotnet Cologne 2010, stürmt dotnet-kicks.de und gewinnt ein Tekpub Abo

Aufruf zum Online-Flashmob ;)

Schreibt einen Online-Artikel, oder einen Blog-Eintrag über die dotnet Cologne 2010  und lasst euch kicken!

Wenn die Startseite von http://dotnet-kicks.de komplett mit Einträgen zur dotnet Cologne voll ist verlose ich unter allen Schreibern auf der dotnet-kicks.de Startseite 5 x ein Monatsabo von http://tekpub.com.

Sollte bis zum 12. Juni 2010 nicht die ganze Startseite voll sein, dann werden nur drei Monatsabos von Tekpub unter den dotnet Cologne Berichterstattern auf der dotnet-kicks.de Startseite verlost.

Der Rechtsweg ist ausgeschlossen, der Gewinn kann nicht ausgezahlt werden.

Technorati-Tags: ,

Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Ein ganzer Tag C# deep dive am 22. Juni in München

Meine Sommerreise ist noch nicht zu Ende, auch in München mache ich Station und werde zusammen mit Golo Roden und David Tielke einen ganzen Tag einen C# Deep Dive machen und jeden Winkel der Sprache und deren Möglichkeiten erörtern.

dotnetpro.powerday C# für Profis am 22. Juni 2010

Warum das ganze?

Leider bekomme ich bei meinen Vorträgen und Rundreisen öfters mit wie der Wissenstand bei C# ist. Es hört hier und da schon bei C# 2 und dessen Generics auf. Bei vielen Vorträgen stoße ich auf fragende Gesichter sobald ich auf C# 3 Features verwenden. Dies ist sehr schade und einem entgehen viele Verbesserungsmöglichkeiten am eigenen Code.

Nicht jeder hat die Möglichkeiten sich im Selbststudium alles beizubringen, oder im Job mal eben zu erarbeiten. Hier und da wendet man bestimmte Features nur an und kennt die Hintergründe nicht und kann somit nicht dass volle Potential nutzen.

Deshalb einen Tag C# einmal komplett durchleuchtet, dies sollte man sich nicht entgehen lassen.

Technorati-Tags: ,,,

Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Neues Projekt: FluentMetadata

Ich bastel da einem neuen Projekt rum. Dabei ist mehr oder weniger FluentMetadata “abgefallen”, bzw. es noch in der Entwicklung. Jedoch ist es zumindest mit ASP.NET MVC 2 schon funktionsfähig und es wird Zeit damit mal an die Öffentlichkeit zu gehen.

FluentMetadata ist eine Möglichkeit Metadaten für Klassen zu definieren diese dann im weitere Programmablauf zu verwenden. Diese kann dann genutzt werden um andere Frameworks mit Informationen zu versorgen.

Seit es nun für die Validierung oder Typ-Informationen. Ganz nach dem DRY Prinzip sollen diese nur an einer Stelle definiert müssen.

Warum?

Ich habe das ganze entwickelt weil ich es Leid war Validierungen mehrfach zu implementieren. Sowohl für meine Entities als auch für die Models des Views.

Um dies zu vermeiden kann man Metadaten die zu einer Klasse definiert sind auch auf anderen Klassen anwenden, aktuell wird dies per Konvention über die gleichen Propertynamen möglich. Dies soll dann noch flexibler werden.

Aktuell implementiert ist ein Metadata Provider für ASP.NET MVC 2. Einer für FluentNHibernate ist auch in Grundzügen vorhanden.

Ziel ist es diese Metadaten mit Adaptern auch anderen Frameworks oder Technologien zu Verfügung zu stellen, z.B. WCF Ria Server, WCF DataServer, WPF ViewModels etc. so dass Metadaten nur noch an einer zentralen Stelle definiert werden.

Der Quelltext ist auf GitHub gehostet.

http://github.com/DerAlbertCom/FluentMetadata/

Die Projektverwaltung versuche ich mal mit Assembla zu machen.

http://www.assembla.com/wiki/show/FluentMetadata/

Die Metadata-Zuweisung ist ähnlich wie bei AutoMapper aufgebaut. Einfach von ClassMeta<> ableiten und im Konstruktur die Metadatan erstellen.

public class NewsMetadata : ClassMetadata<News>
{
    public NewsMetadata()
    {
        Property(x => x.Created).Is.Required();
        Property(x => x.Updated).Is.Required();
        Property(c => c.Title).Is.Required().Length(255);
        Property(c => c.Author).Is.Required();
        Property(c => c.DisplayStart).Is.Required();
        Property(c => c.DisplayEnd).Is.Not.Required();
    }
}

Für ein ViewModel kann ist dies genauso, jedoch sollte man dort mit CopyMetadataFrom<>() die Metadaten eines vorhandenen Type kopieren, falls notwendig kann man noch zusätzliche Metadaten angeben, jedoch kann man diese sofern sinnvoll auch schon in der News-Klasse angegeben haben.

public class PartialNewsModelMetadata : ClassMetadata<PartialNewsModel>
{
    public PartialNewsModelMetadata()
    {
        CopyMetadataFrom<News>();
        Property(x => x.Id).Should.HiddenInput();
        Property(x => x.AuthorId).Should.HiddenInput();
        Property(x => x.Title).Display.Name("Überschrift:");
        Property(x => x.AuthorUserName).Display.Name("Benutzername:").Is.ReadOnly();
        Property(x => x.DisplayStart).Display.Name("Anzeigen ab:");
        Property(x => x.DisplayEnd).Display.Name("Anzeigen bis:");
    }
}

Für jede Klasse muss eine Zuordnung der Metadaten geschehen. Dann kann diese verwendet werden.

Für die Anwendung muss dann nur noch beim Programmstart die Metadaten zusammen gesucht werden und um Falle von ASP.NET MVC 2 der Provider gesetzt werden.

FluentMetadataBuilder.ForAssemblyOfType<News>();
FluentMetadataBuilder.ForAssemblyOfType<PartialNewsModelMetadata>();


ModelMetadataProviders.Current = new FluentMetadataProvider();

Beispiel mit den deklarierten Entities:

http://www.assembla.com/wiki/show/FluentMetadata/Examples

Das ganze ist noch nicht fertig und Bedarf noch einiger Verbesserungen, für Feedback bin ich offen also gebt es mir.

Andere Frameworks

Es gibt zwar schon FluentValidation, jedoch ist da der Ansatz komplett über die Validierung zu gehen und da im Falle für MVC zusätzliche Metadaten drauf zu stülpen. Bei meinem Ansatz setze ich ganz unten an und die Daten werden weiter nach oben Gereicht ohne sie erneut definieren zu müssen.


Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

Zwei Vorträge am 16.-17. Juni auf der APPs-Konferenz in Burghausen

Ein weiterer Zwischenstopp meiner kleinen Vortrags-Sommerreise ist am 16. und 17. Juni in Burghausen.

die APPs-Konferenz in Burghausen ist eine kleine und feine Konferenz mit wenigen aber guten Vorträgen, toller Stimmung und schönem Wissen-Transfer unter den Teilnehmern.

http://www.apps-konferenz.de/

Meine Themen sind

  • Mobile Web-Anwendungen für iPhone & Co mit ASP.NET MVC 2
  • Sketching von User Interfaces mit Balsamiq Mockup

Also, meldet euch. Es gibt gute Vorträge, tolle Leute sowie schöne Giveaways.

 


Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious

xUnit.net und IUseFixture<> für die TestFixture Initialisierung

Mein seit ein paar Monaten favorisiertes Unit Testing Framework ist xUnit.net. Vorher war es MbUnit, dies ist jedoch mit Gallio/MbUnit 3 in eine Richtung gegangen die mir nicht mehr zugesagt (Fett, Groß, Langsam).

xUnit.net ist ein kleines Framework was erweiterbar ist. Meine Hauptgründe für dessen Nutzung sind

  • neue Instanz der Testklasse für jeden Test
  • Minimale notwendige Attributierung
  • “schönere” Assert-Syntax
  • die xunit bdd externsions
  • Mitgelieferte Build-Tasks für Nant, MSBuild etc.
public class SimpleTest
{
    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
        var foo = new SuperKlasse();

        var result = foo.TolleMethode();

        Assert.Equal("SollSein",result);

    }
}

Was einem auffällt ist dass nur [Fact] an der Test-Methode steht, mehr nicht. Kein weiteres Attribut ist für den Test notwendig. Auch gibt es keine [SetUp] Attribut, ein Setup für einen Test wird im Konstruktor der Klasse gemacht.

public class SimpleTest
{
    SuperKlasse foo;

	public SimpleTest()
    {
        foo = new SuperKlasse();
    }

    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
        var result = foo.TolleMethode();

        Assert.Equal("SollSein",result);

    }
}

Da die Klasse für jede Test-Methode neu instanziiert wird wird auch der Konstruktor jedesmal aufgerufen. Somit ist auf diesem Wege auch kein Setup für das komplette TestFixture möglich. Dazu stellt xUnit.net  das IUseFixture<> Interface zu Verfügung. Damit ist es möglich Fixtures für Test zu verwenden, dies kann z.B. notwendig werden wenn das zusammenstellen der Daten länger dauert.

Die Anwendung sieht dann so aus.

public class SimpleTest : IUseFixture<SimpleFixture>
{
    SuperKlasse foo;

    public void SetFixture(SimpleFixture data)
    {

    }

	public SimpleTest()
    {
        for = new SuperKlasse();
    }

    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
	   // der Test	
    }
}

SimpleFixture ist eine beliebige Klasse die überlicherweise im Konstruktur die Initialisierung der notwenden Daten oder Funktionen übernimmt. Sie wird nur einmal pro TestKlasse erzeugt und für für alle Test wird die SetFixture() Methode aufgerufen um eventuell erzeugte Daten in den Test übernehmen zu können.

public class SimpleFixture: IDisposable
{
    public SimpleFixture()
    {
        new Bootstrap.BootstrapMetaData().Execute();
    }

    public void Dispose()
    {
        FluentMetadataBuilder.Reset();
    }
}

Am Ende des Tests wird, sofern implementiert, Dispose() der Fixture Klasse zum aufräumen der Daten aufgerufen

Das schöne daran finde ich dass man sich kleine Fixtures aufbauen kann und diese in verschiedenen Tests verwenden kann. Außerdem sieht man direkt in der Klassendefinition des Test welche Fixtures in den Tests gebraucht werden. Weiter ist es möglich IUseFixture<> mehrfach in einer Test-Klasse einzusetzen.

Technorati-Tags: ,,

Der Eintrag ist mir etwas Wert
Kick Mich! kick it on dotnet-kicks.de    kick it on dotnetkicks.com    Delicious Delicious