Zum Inhalt springen

Windows Store App Picture Search Teil 2 – Windows Runtime Komponenten

Dezember 19, 2012

Picture Search ist eine Windows Store Sample App zum Suchen von Bildern über Bing Search. Im ersten Teil der Serie wurde der Server implementiert – ein Service das mit Hilfe der ASP.NET Web API das Bing Search für die Suche verwendet. Im zweiten Teil wird dieses Service aufgerufen. In diesem Artikel geht es jetzt nicht nur um den Aufruf des Services, sondern auch die Implementierung in einer Windows Runtime Komponente.

image

Libraries für Windows Store Apps

Für Libraries stehen bei Windows Store Apps die mit C# und XAML erstellt werden mehrere Optionen zur Verfügung:

  • Class Library (Windows Store Apps)
  • Windows Runtime Component
  • Portable Class Library

Die Class Library (Windows Store Apps) ist eine .NET Library wie wir sie von .NET Applikationen kennen – aber reduziert auf das .NET Subset das für Windows Store apps zur Verfügung steht.

Die Portable Class Library ist im Add New Project dialog nicht in der Kategorie der Windows Store templates zu finden. Stattdessen ist es in der Windows Kategorie. Das ist auch eine Library die nicht auf Windows Store apps reduziert ist. Diese Library steht auch für Windows desktop apps, und Silverlight apps zur Verfügung. Bei der Konfiguration dieser Library kann eingestellt werden für welche Technologie (inklusive Xbox 360) Applikationen erstellt werden. Dementsprechend wird das Subset der zur Verfügung stehenden .NET Klassen und Methoden reduziert oder erweitert.

image

Die dritte Option ist Windows Runtime Component. Im Unterschied zu Class Library und Portable Class Library steht diese Variante nicht nur für .NET Applikationen zur Verfügung. Diese Library kann auch von Windows Store apps die mit anderen Technologien erstellt werden zum Einsatz kommen, z.B. von JavaScript. Dementsprechend erfordert das aber eine andere Handhabung.

Erstellen einer Windows Runtime Component mit C# und verwenden dieser mit C++ oder JavaScript Apps bedeutet auch dass die .NET Runtime im C++ oder JavaScript Projekt geladen werden muß. Eine Alternative hier wäre es die Windows Runtime Component mit C++ zu implementieren.

Creating a Windows Runtime Component

Windows Runtime Components können mit dem Visual Studio Project Template Windows Runtime Component erstellt werden:

image

Nur sealed Types

Eine wichtige Einschränkung bei diesem Library-Typ ist dass alle public types sealed sein müssen – eine Ausnahme gibt es nur für UI Komponenten.

PictureInformation repräsentiert die Daten die vom Service übernommen werden: Title, Url, ThumbnailUrl und Source. Außer dass diese Klasse sealed ist, unterscheidet sich diese Klasse nicht von normalen .NET Klassen. Properties können von Windows Runtime Komponenten direkt angeboten werden.

public sealed class PictureInformation
{
  public string Title { get; set; }
  public string Url { get; set; }
  public string ThumbnailUrl { get; set; }
  public string Source { get; set; }
}

Converting a JSON Array to an Object List

Die zweite Klasse in diesem Assembly ist SearchManager. Diese Klasse ist wie auch PictureInformation sealed.

Die Methode GetImagesAsyncInternal macht einen Aufruf zum Web Service. Wie auch im ersten Teil der Serie wird die .NET 4.5 HttpClient Klasse für den Aufruf zum Service verwendet. GetStringAsync liefert das JSON Ergebnis vom Service.

Ein JSON String kann mit Hilfe von Klassen im Namespace Windows.Data.Json geparsed werden. Zum Verarbeiten von JSON und XML Daten – Daten die oft von Services kommen – bietet die Windows Runtime die Namespaces Windows.Data.Json, Windows.Data.Xml.Dom und Windows.Data.Xml.Xsl.

private async Task<IEnumerable<PictureInformation>> GetImagesAsyncInternal(string searchTerm)
{
  string urlRequest = url + searchTerm;
  var client = new HttpClient();
  string jsonResult = await client.GetStringAsync(urlRequest);

  var results = await Task.Run<IEnumerable<PictureInformation>>(() =>
  {
    var searchItems = new List<PictureInformation>();

    JsonArray result;
    if (JsonArray.TryParse(jsonResult, out result))
    {
        foreach (var jsonItem in result)
        {
            JsonObject jsonObj = jsonItem.GetObject();

            var searchItem = new PictureInformation
            {
                Title = jsonObj["Title"].GetString(),
                Url = jsonObj["Url"].GetString(),
                Source = jsonObj["Source"].GetString(),
                ThumbnailUrl = jsonObj["ThumbnailUrl"].GetString()
            };
            searchItems.Add(searchItem);
        }
    }
    return searchItems;
  });

  return results;
}

 

Die Methode GetImagesAsyncInternal verwendet die C#5 async und await Keywords für den Aufruf von asynchronen Methoden. Dementsprechend liefert die Methode einen Task zurück. Der Aufrufer kann beim Aufruf dieser Methode auch die Task continuation mit dem async Keyword verwenden um den Caller Thread nicht zu blockieren. Ist diese Methode aber public deklariert, gibt es einen Compiler Fehler dass der Type Task kein gültiger Windows Runtime Type ist. Bei public Methoden innerhalb von Windows Runtime Components sind nur Windows Runtime kompatible Typen erlaubt.

Der Task kann aber recht einfach – mit Hilfe der Extension Methode AsAsyncOperation – auf einen Windows Runtime kompatiblen Type umgewandelt werden. AsAsyncOperation ist eine Extension Methode für die Task Klasse und retourniert IAsyncOperation. IAsyncOperation ist das Interface der Windows Runtime (Namespace Windows.Foundation) für asynchrone Aufrufe, und kann auch mit C# 5 async und await genutzt werden.

public IAsyncOperation<IEnumerable<PictureInformation>> GetImagesAsync(string searchTerm)
{
  Task<IEnumerable<PictureInformation>> t = GetImagesAsyncInternal(searchTerm);
  return t.AsAsyncOperation();
}

Summary

Windows Runtime Components sind Libraries für Windows Store apps die sowohl mit .NET als auch mit JavaScript verwendet werden können. Dabei gibt es aber die Einschränkung auf Windows Runtime Typen in der Signatur. Mit Hilfe von kleinen Hilfsmitteln wie Extension Methoden für den Task ist das aber einfach möglich.

Christian

CN innovation

Mehr Infos zu Windows Store Apps in meinem Buch Professional C# 5 and .NET 4.5, und in meinen Windows Store App Workshops.

Artikel dieser Serie:

Teil 1: Web API – Suche mit Bing

Teil 2: Windows Runtime Components

Teil 3: Layout

Teil 4: Settings

Teil 5: Search

Teil 6: Sharing

Kommentar verfassen

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: