Windows Azure eksempel på SQL Service

Jeg har afprøvet Windows Azure SQL Services med succes. Og jeg vil prøve at demonstrere tilgangen med nogle kode eksempler, men overordnet er min oplevelse at det minder lidt om at arbdejde Db4o. Db4o er en "Database For Objects", og er bygget op omkring at databasen er fil på filsystemet som der arbejdes med gennem databasesystemets API. Et eksempel på hvordan Db4o kan bruges:

(Db4o) Åbn database

 

   1:  // accessDb4o
   2:   
   3:     ObjectContainer db=Db4o.openFile(Util.DB4OFILENAME);
   4:     try {
   5:         // do something with db4o
   6:     }
   7:     finally {
   8:         db.close(); 
   9:     }

(Db4o) Gem et objekt

 

   1:  // storeFirstPilot 
   2:   
   3:     Pilot pilot1=new Pilot("Michael Schumacher",100);
   4:     db.set(pilot1); 
   5:     System.out.println("Stored "+pilot1);
   6:   
   7:      OUTPUT: 
   8:         Stored Michael Schumacher/100

(Db4o) Forespørgsel

 

   1:  // retrieveAllPilotQBE 
   2:     
   3:     Pilot proto=new Pilot(null,0);
   4:     ObjectSet result=db.get(proto);

 

Ser vi nærmere på hvordan Windows Azure SQL Services kan bruges her i mit eksempel via SOAP:

(Azure) Åbn database, betegnes som Container, og gem et objekt.

public void Save()
{
    using (SitkaSoapServiceClient s = new SitkaSoapServiceClient("BasicAuthEndpoint"))
    {
        s.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["sdsUsername"];
        s.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["sdsPassword"];

        Scope objScope = new Scope();
        objScope.AuthorityId = AuthorityId;                       // My solution name
        objScope.ContainerId = ContainerId;                       // The id of the container
        Entity objSupportEntity = new Entity();
        objSupportEntity.Id = this.Id;                            // Unique id of my entity
        objSupportEntity.Kind = this.GetType().ToString();        // Name of the Kind
        objSupportEntity.Properties = this.GetDictFromThis();     // Properties a Dictionary

        s.Create(objScope, objSupportEntity);                     // Save the entity into the container

    }
}
private Dictionary<string, object> GetDictFromThis()
{
    Dictionary<string, object> obj = new Dictionary<string, object>();
    obj["Id"] = this.Id;
    obj["Subject"] = this.Subject;
    obj["Message"] = this.Message;
    obj["Date"] = this.Date;
    obj["IsSolved"] = this.IsSolved;
    obj["CreatedBy"] = this.CreatedBy;
    obj["AssignedTo"] = this.AssignedTo;
    return (obj);
}

Metoden GetDictFromThis kunne vi faktisk lave mere generisk hvis vi ville med Reflections.

(Azure) Forespørgsel på alle entities i min container

Scope objScope = new Scope();
objScope.AuthorityId = AuthorityId;
objScope.ContainerId = ContainerId;
List<Entity> objEntities = s.Query(objScope, "from e in entities select e");

Scope objektet understøtter forespørgsler i LINQ og i min Service Reference Configuration til min SQL Services solution skal vi sætte "Collection type" til System.Collections.Generic.List da det er hvad SQL Services returnérer.

Sammen lignet med Db4o er SQL Services lidt mere abstrakt og der rejser sig også hurtigt nogle håndterings spørgsmål i hovedet på mig: Hvordan styrer jeg hvilke entities der gemmes hvor og i det hele taget bevarer et overblik over min datastruktur? Godt nok har jeg attributen "Kind" på min Entity, men det er en string-værdi og hvad sker der hvis den overskrives med en forkert "Kind"?

Så der skal stadig planlægges en datastruktur hvor jeg i dette tilfælde synes der ville virke logisk at man styrer efter "conventions over configuration" så man bygger en ensartethed op i nogle base-klasser som ens objekters data kan styres med.

Hvis du vil se ovenstående Windows Azure SQL Services i aktion så hop ind på http://co3azurelab.co3.dk. Demo løsningen er tænkt som et mikro support-system hvor alle data gemmes i Windows Azure SQL Services som vist ovenfor.

Demo: http://labs.co3.dk/azure/

, ,

Skriv et svar

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>