Ein jeder von uns hat es bestimmt schon mal geschrieben; Sei es zum Mocken, sei es zum Zeitvertreib oder sei es für den Produktiveinsatz; Aber Golo Roden und Peter Bucher haben es nun auch mal released. Die Rede ist vom XmlRepository.
Golo und Peter haben in diesen Tagen auf http://www.XmlRepository.ch eine kleine Bibliothek zur bequemen Datenspeicherung im Xml-Format bereitgestellt. XmlRepository bedarf keiner großen Beschreibung. Der Name der Assembly impliziert eigentlich deren Aufgabengebiet. Daher lasse ich dies einfach aus ;)
Mich persönlich hat es gereizt diese Bibliothek auszuprobieren,weil auch ich an allen Ecken und Enden immer mal wieder “ein” XmlRepository schreibe, sei es zum UnitTesting, sei es zum ablegen und laden bestimmter Daten,… Aber ich wollte nun einfach sehen ob sich unsere Ideen und Interpretationen eines XmlRepositories überschneiden und welchen Ansatz die beiden gewählt haben.
Lange Rede kurzer Sinn – XmlRepository mach Spaß daher möchte ich es einfach zeigen xD
Ausgehen moechte ich von einer einfachen Personenklasse, welche durch den Einsatz des XmlRepositories zugreifbar gemacht werden soll.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public bool IsDeveloper { get; set; }
}
Zunächst 2 Anweisungen Infrastruktur, die dazu dienen die folgenden XmlRepositories zu konfigurieren
XmlRepository.XmlRepository.DataProvider =
new XmlRepository.DataProviders.XmlInMemoryProvider();
XmlRepository.XmlRepository.DefaultQueryProperty =
"LastName";
zum einen wird der DataProvider hier auf InMemory festgelegt – alternativ kann noch InFile angegeben werden. Im zweiten und letzten “infrastrukturellen” Schritt wird noch der “Identifier” fürs Repository festgelegt.
Und schon kann's auch schon losgehen
Instanz erstellen
repository =
XmlRepository.XmlRepository.GetInstance<Person>();
Elemente hinzufügen / aktualisieren / löschen
repository.SaveOnSubmit(person);
repository.DeleteOnSubmit((e)=> e.LastName==entity.LastName);
Ich könnte jetzt natürlich alle Methoden auflisten die der Provider bzw. das IXmlRepository<T> bereitstellt, aber die Methoden sind entweder bereits von IEnumerable<T> bekannt oder so sprechend benannt, dass man nichts mehr großartig dazu sagen muss.
Beispielprojekt
Um mir einfach mal ein Bild von XmlRepository zu machen, habe ich mehrere kleine Beispielprojekte implementiert, eines, den PersonStorage könnt ihr euch hier downloaden und den Code anschauen.
Durch den geschickten Einsatz von Generics kann man den Code rund um XmlRepository auch fließend und sprechend halten, so habe ich zum Beispiel die Klasse Create<T> implementiert, die einen Wrapper um das erstellen von Objekten darstellt; Funktional absolut 0 Nutzen halt einfach noch etwas Syntactic Sugar. #geek
class Create<T>
{
public static T With(Func<T> with)
{
return with.Invoke();
}
}
Doch warum ist XmlRepository interessant?
Nun eigentlich ist es meiner Meinung nach die spielerische Einfachheit gepaart mit wenigen aber dennoch sehr wichtige Attributen die das Repository ausmachen
- es ist schnell
- es ist einfach anzuprogrammieren
- der Code bleibt lesbar
- der XmlRepository Code ist lesbar!
- XmlRepository ist threadsafe!
- der XmlRepository Code ist getestet
- XmlRepository lässt euren Code testbar!
Daher werde ich das Projekt der beiden auf jeden Fall weiterhin beobachten und nutzen. Eventuell findet sich mal in naher Zukunft ein kleines WebProjekt welches ich auf XmlRepository aufbauen kann.
Hints an die Erfinder
Ich weiss, die Version 1.1 wurde schnell mal so published, dennoch hier mal kurz ein paar Dinge die mir aufgefallen sind:
Namespace und KlassenName XmlRepository finde ich etwas unschön Abhilfe schafft aktuell
using XR = XmlRepository;
//...
//...
this._repository = XR.XmlRepository.GetInstance<Foo>();
Zwar bietet die API - dank des Expression-Tree - Parameters für die Methode DeleteOnSubmit eine variable Schnittstelle, dennoch fände ich es gut wenn es für Delete … (und auch die anderen CRUD Methoden) direkt schon eine Überladung gäbe die direkt auf die DefaultQueryProperty geht. – Oder habe ich da etwas übersehen?
Fazit
XmlRepository ist eine Idee mit potential, vielleicht nicht im Hinsicht auf den Verwirklichungsgrad von Peter und Golo, aber sicherlich kann die Assembly als Beispiel dafür dienen wie einfach und elegant man alltägliche Szenarien lösen kann. Fehlt natürlich nur noch die nächste Evolutionsstufe das JsonRepository. Eventuell mache ich mich mal daran :) Falls Peter und Golo nicht schon dran sind???!!!