« Chaos vs. Management | Main| Mehr Geld :-D »

Zufällig bin ich auf SubSonic gestossen

9
Kategorie   
Nähere Informationen hier
Was mich erstaunt hat, ist dass man mit zwei Zeilen Code, ein Objekt in der Datenbank versenkt und die Tabellenstruktur in der DB automatisch angepasst wird ->

var repo = new SimpleRepository("LogDB",SimpleRepositoryOptions.RunMigrations);
repo.Add<ClassName>(o);  

Einfacher geht es wohl kaum....
Klar, komplexe Datenstrukturen, Relationen, Constraints usw. ist das SimpleRepository vielleicht nicht ganz angebracht, aber um einfach nur Parameter wegzuschreiben, sollte ja kein Problem sein.

   public class ClassA  {
     public Guid ID { get; set; }
     public string I { get; set; }

      public ClassA() {
        ID = Guid.NewGuid();
        I = DateTime.Now.ToString();
     }
  }

  public class ClassBContainsA {
     public Guid ID { get; set; }
     public ClassA A { get; set; }
     public ClassA[] As { get; set; }
     public ClassBContainsA() {
        ID = Guid.NewGuid();
     }
  }  


Leider kann das Simple Repository die zweite Klasse (ClassBContainsA) nicht korrekt wegschreiben, was ein wenig schade ist, aber es heißt ja nicht umsonst simple Repository
Jedoch sollte es ja möglich sein, mit ein wenig Reflection, Klassen wir im obigen Beispiel wegzuschreiben. OK, neue Aufgabe, wieder mal was zu Proggern
Also erstes mache ich mir ein Interface, mit welchem ich die Parameter, welche ich wegschreiben möchte taggen kann ->

   public interface ISubSonic {
     Guid ID { get; set; }
     void Add(SimpleRepository repo);
  }


ISubSonic ist ein cooler Name
Meine Klassen ClassA und ClassBContainsA sehen dann wie folgt aus:

   public class ClassA : ISubSonic {
     public Guid ID { get; set; }
     public string I { get; set; }
     public ClassA() {
        ID = Guid.NewGuid();
        I = DateTime.Now.ToString();
     }
     public void Add(SimpleRepository repo) {
        repo.Add<ClassA>(this);
     }
  }

  public class ClassBContainsA : ISubSonic {
     public Guid ID { get; set; }
     public ClassA A { get; set; }
     public ClassA[] As { get; set; }
     public ClassBContainsA() {
        ID = Guid.NewGuid();
     }
     public void Add(SimpleRepository repo) {
        repo.Add<ClassBContainsA>(this);
     }      
  }
 

OK, nicht wirklich schön, aber was sind 3 Zeilen pro Klasse, wenn ich die DB Struktur und den DAL nicht implementieren muß???

Richtige Antwort -> Ganz schön wenig!!!

OK, jetzt brauche ich nur noch einen der die Parameter wegschreibt -> hier mein Code -> Kommentare in BLAU

   
  Meine Klasse ist selbst mit dem ISubSonic getaggt, damit ich die Referenzen alle mit einer Methode ADD wegschreiben kann und wer weiß evtl. gibt es später ja mal Referenzen auf Referenzen usw.
   public class SubSonicParameterLogger : ISubSonic {
     

     Hier ein paar Verwaltungsinformationen, wie die Relation aufgebaut ist, wer ist Child und wer Parent und wie heißt, das Property wo ich gerade dran hänge?
     public Guid ID { get; set; }
     public Guid ChildID { get; set; }
     public string Child { get; set; }
     public Guid ParentID { get; set; }
     public string Parent { get; set; }
     public string ParentMember { get; set; }
     public ISubSonic value { get; set; }
   
Ein paar Konstruktoren für die Verwaltung nicht aufregendes
     public SubSonicParameterLogger() {
     }

     public SubSonicParameterLogger(ISubSonic xValue) {
        ID = Guid.NewGuid();
        Child = xValue.GetType().FullName;
        ChildID = xValue.ID;                  
        Parent = string.Empty;
        ParentMember = string.Empty;
        ParentID = new Guid();  
        value = xValue;      
     }

     public SubSonicParameterLogger( ISubSonic xValue, ISubSonic xParent ) : this(xValue) {
        if (xParent!=null) {
           ParentID = xParent.ID;
           Parent = xParent.GetType().FullName;
        }        
     }

     public SubSonicParameterLogger( ISubSonic xValue, ISubSonic xParent, string xMember ) : this(xValue,xParent) {
        if (xMember!=null) {
           ParentMember = xMember;
        }
     }

     Hier werden die Properties behandelt, ist ein Property getaggt, dann als Child wegschreiben
     private void PropertyHandler(SimpleRepository repo, PropertyInfo p) {
        if (p.PropertyType.GetInterfaces().Contains(typeof(ISubSonic))) {
           SubSonicParameterLogger sspl = new SubSonicParameterLogger((ISubSonic)(p.GetValue(value, null)), value, p.Name);
           sspl.Add(repo);
        }
     }

     Arrays müssen ein wenig anders behandelt werden, also haben die einen eigenen Handler
     private void PropertyArrayHandler(SimpleRepository repo, PropertyInfo p, int i, object o) {
        if (o != null && o.GetType().GetInterfaces().Contains(typeof(ISubSonic))) {
           SubSonicParameterLogger sspl = new SubSonicParameterLogger((ISubSonic)o, value, p.Name + "[" + i + "]");
           sspl.Add(repo);
        }
     }

     In der Methode ADD steppe ich also über die Properties und schreibe diese, wenn getaggt einfach wech
     public void Add(SimpleRepository repo) {
        value.Add(repo);
        Type t = value.GetType();
        if (!Parent.Equals(string.Empty)) {    
           repo.Add<SubSonicParameterLogger>(this);              
        }
        foreach( PropertyInfo p in value.GetType().GetProperties()) {
           PropertyHandler(repo, p);
           if (p.PropertyType.IsArray) {  
              int i = 0;
              foreach(object o in (object[])(p.GetValue(value,null))) {
                 PropertyArrayHandler(repo, p, i, o);
                 i++;
              }
           }
        }
     }      
  }



Was wollte ich noch sagen, geht soweit, aber wenn jemand mit den Properties einen geschlossenen Kreis aufbaut, dann geht das Teil in die Hose

Gruß JJR
P.S.:  Code

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2