20 May
2010

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
 
Comments have been closed on this topic.