Synkronisering och Offlinestöd på köpet - Live Mesh!

Live Services är en del av Azure Services Platform (Azure) . Inom denna låda av Azure finner du tjänster som Live ID, Live Mesh, Contacts, Photo Gallery, Spaces med flera. Många av dessa tjänster känner du säkert igen sedan tidigare. Live Mesh (Mesh) kanske du, precis som jag, använder  för att synkronisera filer mellan olika datorer. Det som gör mig lite extra exalterad över Live Mesh är dess (kommande) möjligheter  att synkronisera applikationer och applikationsdata mellan dina enheter och till dem du eventuellt väljer att dela med dig av informationen till.

Live Framework ger oss ett enhetligt ramverk och gränssnitt för att konsumera Live tjänsterna genom den Resursmodell (Resource Model) som exponeras. Denna inkluderar naturligtvis Mesh.

Jag tänkte inte berätta mer om Live Services och Live Framework generellt utan uppmanar dig att ägna en stund åt läsning på MSDN eller titta på PDC videos. Istället tänkte jag visa hur du kan använda Mesh för att lagra din applikationsdata och därmed göra den tillgänglig på enheter och i molnet.

LiveOperatingEnvironment (LOE) är klassen som är den enhetliga vägen till Live tjänsterna. Instansiera den och anropa Connect. I nedan exempel loggar jag in med mitt Live ID konto. Eftersom jag inte anger någon Endpoint URI som parameter kommer LOE kontrollera om jag har Live Framework Client startad, om jag har det ansluter den till den lokala LOE instansen, om inte ansluter den till LOE instansen in molnet. Det är bland annat just detta som är det fina med LOE; API:erna är exakt de samma lokalt som i molnet, det är bara adressen till instansen som skiljer.

 LiveOperatingEnvironment loe = new LiveOperatingEnvironment();
loe.Connect(
    new NetworkCredential("theuser@live.com", "thepassword"),
    new LiveItemAccessOptions(true)
 );

Scenariot för detta exempel är en inköpslista. Jag kan ange vad som behöver inhandlas i en applikation och sedan få denna information att synkroniseras till mina enheter, däribland min Windows Mobile lur, som kör en applikation som konsumerar samma Feed. På så vis kan jag alltid se och uppdatera vad som behöver inhandlas och alltid ha uppdaterad, relevant, information till hands.

Det första jag behöver för applikationen är ett MeshObject. Detta är det objekt som kan delas, Mount:as till enheter och sättas rättigheter på. T ex en Folder (mapp) i Live Mesh är ett MeshObject. I detta exempel är det min inköpslista. Jag lägger helt enkelt till mitt ShoppingList-MeshObject i MeshObjects kollektionen på LOE instansen.

 MeshObject mo = new MeshObject("MeshShoppingList");
mo.Resource.Type = "MeshShoppingList";
loe.Mesh.MeshObjects.Add(ref mo);

MeshObject;et i sig kan inte innehålla informationen jag behöver spara. Däremot kan det innehålla en eller flera Feeds. Jag lägger därför till en Feed till mitt MeshObject för att kunna spara innehållet i min inköpslista.

 DataFeed feed = new DataFeed("MeshShoppingListFeed");
mo.DataFeeds.Add(ref feed);

Jag behöver ett par nya jeans, och det är omgående. (Prio 1). Jeansen läggs till ett DataEntry vilket i sin tur läggs till DataEnties kollektionen på min DataFeed.

 ShoppingListItem listItem = new ShoppingListItem()
{
    Category = "Clothes",
    Title = "Jeans",
    Priority = 1
};

DataEntry entry = new DataEntry();
entry.Resource.Type = "MeshShoppingListItem";
entry.Resource.SetUserData<ShoppingListItem>(listItem);
feed.DataEntries.Add(ref entry);

- Feeds och Entries.Känns det igen? ATOM?

Detta är allt som behövs för att skapa min inköpslista och lägga till ett par jeans till den. Dessutom kan nu informationen synkroniseras till mina enheter – på köpet skulle man kunna säga.

Med Live Framework SDK kommer ett verktyg som heter Live Framework Resource Browser, med vilket jag med enkelhet kan verifiera att min inköpslista är skapad och innehåller korrekt information. Med verktyget kan jag navigera mig runt, och göra förändringar, i Resursmodellen både i den lokala- och moln- instansen.

Jag klickar på MeshObjects i Cloud Live Operating Environment.

image

Bland mina MeshObjects ser jag min inköpslista. På URL:en i adressfältet kan jag intygas att det är molninstansen av LOE jag navigerar mig i. För att se innehållet i mina Feeds navigerar jag mig vidare genom att klicka på DataFeeds länken.

image

Efter att ha klickat på länken för Feed:ens DataEntries kan jag se att mina jeans framgångsrikt har funnit sin plats i molnet.

image

Nu när jag vet att inköpslistan sparas som den skall, vill jag naturligtvis kunna läsa ut innehållet från den med kod. Värt att tänka på är att allt i Resursmodellen representeras av Feeds, vilket också reflekteras till viss del i API:erna. Notera t ex användandet av Entries och Resource egenskaperna på kollektionerna och de enskilda objekten. I övrigt är det väldigt rakt på.

 MeshObject shoppingList = loe.Mesh.MeshObjects.Entries
    .FirstOrDefault(m => m.Resource.Type == "MeshShoppingList");

if (shoppingList != null) {
    DataFeed shoppingListFeed = shoppingList.DataFeeds.Entries
        .FirstOrDefault(f => f.Resource.Title == "MeshShoppingListFeed");

    if (shoppingListFeed != null) {
        foreach (var dataEntry in shoppingListFeed.DataEntries.Entries) {
            ShoppingListItem item = dataEntry.Resource.GetUserData<ShoppingListItem>();
            Debug.WriteLine(
                string.Format("({0}) {1}, {2}", item.Priority, item.Title, item.Category)
                );
        }
    }
}

Något som jag medvetet utelämnat från denna artikel är hanteringen av konflikter vid synkronisering – det är ett ämne för sig själv och kan möjligen hitta fram till en egen artikel.

Ladda ned Live Framework SDK och testa själv!

 

-c