Tag: .Net


Amazon möchte .NET Entwickler in die AWS Cloud entführen

Die Amazon Web Services hübschen sich weiter auf, um ihre Attraktivität für Microsoft .NET Entwickler zu steigern. Dazu hat das Unternehmen kürzlich zwei Neuigkeiten angekündigt, die sich auf exakt diese Zielgruppe konzentrieren. Bei der einen handelt es sich um Amazon RDS for SQL Server, einem Service für den Microsoft Datenbankserver. Die Zweite ermöglicht nun das Deployment von .NET Anwendungen auf der Amazon Elastic Beanstalk Plattform.

Entwickler haben zusätzlich zu ihrem Code in der Regel ebenfalls mit dem Deployment und der Administration ihrer Datenbanken zu tun, was zu einer nicht trivialen Aufgabe werden kann. Insbesondere dann, wenn Updates eingespielt oder Backups erstellt werden müssen. Die Amazon Web Services haben sich seit längerem diesem Thema angenommen und unterstützen mit Amazon RDS bereits Oracle und MySQL Datenbanken.

Jetzt erweitert Amazon sein Angebot für Windows Entwickler. Amazon RDS for Microsoft SQL Server ermöglicht es der Microsoft Entwickler Gemeinde seine Datenbankoperationen für Microsoft SQL Server 2008 R2 und SQL Server 2012 in die Amazon Cloud auszulagern. Dabei wird der Microsoft SQL Server 2008 R2 bereits jetzt schon, der SQL Server 2012 im Laufe des Jahres unterstützt.

Darüber hinaus können Entwickler von ASP.NET Anwendungen nun ebenfalls Amazons PaaS Elastic Beanstalk für das Deployment in der Amazon Cloud nutzen. Um die Applikation in die Cloud hochzuladen, stellt Amazon das AWS Toolkit for Visual Studio bereit. Elastic Beanstalk übernimmt anschließend automatisch die Kapazitätsplanung, sowie die Konfiguration des Load Balacing und das Monitoring für die Anwendung.

Der AWS Elastic Beanstalk Service befindet sich aktuell noch in der Beta Phase und nutzt die Microsoft Internet Information Services (IIS) 7.5 und das Windows Server 2008 R2 AMI (Amazon Machine Image), um die .NET Anwendungen auszuführen. Neben der Nutzung von mehreren Availability unterstützt Elastic Beanstalk mittlerweile auch die Amazon Virtual Private Cloud.

Neue Kunden können Elastic Beanstalk kostenlos nutzen. Dazu erhalten sie eine Amazon RDS Micro Instance incl. SQL Server Express Edition, die ein Freikontingent von 750 Stunden pro Monat beinhaltet. Zudem dürfen für ein Jahr lang 10 Millionen I/O Anfragen pro Montag gestellt werden und Amazon spendiert sogar noch 20GB Datenbankspeicher.



Windows Azure Konkurrent AppHarbor ist nun in Europa verfügbar

AppHarbor ist ein .NET Platform-as-a-Service, den Entwickler in Kombination mit Git oder Mercurial nutzen können, um ihren Code zu übertragen. AppHarbor kompiliert im Anschluss den Code und führt eine Reihe von Unit Tests durch. Ist die Anwendung fehlerfrei, wird der Code auf die skalierbare Cloud Plattform von AppHarbor ausgerollt. Wie von PaaS Angeboten bekannt, können sich Entwickler bei der Nutzung von AppHarbor auf das Wesentliche konzentrieren und sich nicht um die Installation und Konfiguration der Server und Software kümmern.

Heroku ist ein Platform-as-a-Service, der unterschiedliche Programmiersprachen unterstützt. Die erste war Ruby im Jahr 2007 und wurde zu einem riesigen Erfolg. Es folgten weitere Sprachen wie Java, Node.js, Scala, Clojure, Python und PHP. AppHarbor machte sich im letzten Jahr daran "Heroku für .NET" zu unterstützen.

Zunächst war AppHarbor nur in den USA verfügbar. Seit gestern können nun auch europäische Entwickler den Service nutzen. Die Anwendungen aus der EU werden zwar weiterhin auf den Amazon Web Services gehostet, jedoch nun in der Region EU-West (Dublin) anstatt in der Region US-East, wo sich alle anderen Anwendungen befinden.

Alle Add-ons im AppHarbor Katalog funktionieren mit EU basierten Anwendungen. Einige, wie bspw. der SQL-Server werden je nach Ort der Anwendungen bereitgestellt. Für Add-ons, die derzeit die Nutzung in der EU nicht unterstützen, wird aktuell eine Benachrichtigung angezeigt, wenn das Add-on an eine EU Anwendung ausgerollt wird.

AppHarbor wurde entwickelt, um den Microsoft Windows Azure Einschränkungen, wie dem Lockin in Microsofts eigene Datenbank oder der nicht Unterstützung von Git, zu begegnen.



Casablanca: Microsoft schiebt C++ in die Cloud

Am 30. April haben die Microsoft DevLabs (Developer Division Labs) mit dem Codenamen "Casablanca" eine Reihe von neuen C++ Bibliotheken veröffentlicht. Damit sollen Entwickler einfacher auf RESTful Services zugreifen können, bzw. diese selbst implementieren. Das schreibt Microsoft Developer Division Corporate Vice President Soma Somasegar in seinem Blog.

Casablanca ist eine Microsoft Inkubation, um die Cloud basierte Client-Server Kommunikation in nativem Code zu unterstützen. Dabei wird eine modernes asynchrones C++ API Design verwendet, so die Microsoft DevLaps Webseite. Casablanca ermöglicht dazu den Zugriff auf REST Services aus nativem Code von Windows Vista, Windows 7 und der Windows 8 Consumer Preview, indem asynchrone C++ Bindings für HTTP, JSON und URIs zur Verfügung stehen.

Dafür bietet Microsoft eine Erweiterung für sein Visual Studio SDK, mit der Entwickler die entsprechende Unterstützung zum Schreiben von C++ HTTP Client Code in Windows 8 Apps und nativem REST Code für Azure erhalten.

Casablanca ist das Produkt aus Erfahrungen, die durch .NET, Node.js, Erlang und weiteren Einflüssen gesammelt wurden, um daraus eine Architektur zu bauen, mit der skalierbare und flexible Anwendungen entwickelt werden können, schreibt Somasegar.

C#, Visual Basic und F# Entwickler arbeiten bereits mit robusten und skalierbaren Netzwerkstacks. Node.js Entwickler können das Windows Azure Software Development Kit (SDK) und JavaScript nutzen, um skalierbare Anwendungen zu schreiben, so Somasegar. Jedoch fehlten für C++ Entwickler ähnliche Tools, die für die Nutzung und der Implementierung von RESTful Cloud Services in Verbindung mit modernen C++ Funktionen genutzt werden konnten.

Für Casablanca, wie auch bei anderen DevLaps Releases, steht noch nicht fest, ob es als ein offizielles Produkt oder Teil eines Produkts auf dem Markt erscheint. In erster Linie dient es dem Test und dem Entwickler Feedback.



Analyse: Die Platform-as-a-Service Umgebung von VMware Cloud Foundry

Ursprünglich startete Cloud Foundry als Plattform für das Deployment von Java Spring Anwendungen auf die Amazon Web Services. Im April 2011 folgte dann die Übernahme durch VMware, wodurch Cloud Foundry zu einem Open Source und Multi-Framework Platform-as-a-Service Angebot wurde, das eine Vielzahl von unterschiedlichen Sprachen und Laufzeitumgebungen unterstützt. Dazu gehören u.a. Java, Spring, Ruby, Scala und Node.js. VMware bezeichnet Cloud Foundry auch als ein Open PaaS, da die Plattform vom gewöhnlichen Notebook, über einen PC bis hin zu einer Public Cloud auf unterschiedlichen Systemen und Umgebungen genutzt werden kann.

Cloud Foundry ermöglicht das Multi-Cloud Deployment

Die Cloud Foundry Plattform setzt sich aus drei Bereichen zusammen. Der Erste bezieht sich auf die Wahl des Frameworks, der Zweite auf die Serviceunterstützung der Anwendung und die Dritte auf das Deployment.

Die Wahl des Frameworks

Cloud Foundry unterstützt neben Spring for Java, Rails und Sinatra for Ruby und Node.js ebenfalls JVM Sprachen wie Groovy, Grails und Scala. Hinzu kommt die Unterstützung für das Microsoft .NET Framework wodurch Cloud Foundry zur ersten nicht Microsoft Plattform gehörte, auf der .NET Anwendungen ausgerollt werden konnten. Alles zusammen macht Cloud Foundry zu einem der ersten mehrsprachigen PaaS.

Services für die Anwendung

In der Cloud sind Entwickler auf zuverlässige Messaging-Systeme, NoSQL Datenbanken zusammen mit relationalen Datenbanken angewiesen. Cloud Foundry unterstützt dafür neben RabbitMQ als Messaging-System sowie MongoDB und Redis als NoSQL Datenbanken, MySQL als relationale Datenbank. Die Liste der unterstützten Dienste wächst, so hat die Plattform zuletzt eine PostgreSQL-Unterstützung erhalten.

Das Deployment

Anhand von "Micro Cloud Foundry" kann Cloud Foundry auf gewöhnlichen Notebooks oder Computer genutzt werden. Dazu beinhaltet die Micro Cloud Foundry den vollständigen Cloud Foundry Stack, mit dem virtuelle Maschinen auf einem PC oder Mac gestartet werden können. Cloud Foundry kann zudem in Private Cloud oder Public Cloud Umgebungen wie den Amazon Web Services betrieben werden. Das macht Cloud Foundry zu einem äußerst flexiblen PaaS.

Ausrollen von Anwendungen auf Cloud Foundry

Entwickler können Anwendungen entweder mit der SpringSource Tool Suite (STS) oder VMC, einer Ruby Gem Kommandozeile deployen.

Das Messaging System ist das Rückgrat von Cloud Foundry. Es handelt sich dabei um das zentrale Kommunikationssystem, über das alle Komponenten miteinander sprechen. Der HTTP Verkehr zu den einzelnen Anwendungen wird von Routern gesteuert. Diese routen die URLs zu den jeweiligen Anwendungen und übernehmen ebenfalls das Load Balancing des Verkehrs über die Instanzen.

Cloud Controller sind die Schlüsselkomponenten, die für die Verwaltung der Anwendungen zuständig sind. Sie verknüpfen die verschiedenen Services mit einer Anwendung und ermöglichen den Zugriff durch die externe REST API.

Ein Health Manager überwacht den Zustand aller ausgeführten Anwendungen. Fällt eine Anwendung aus, informiert er den Cloud Controller. Dieser ergreift die weiteren Maßnahmen.

Der ausführbare Code wird in Cloud Foundry zu Einheiten zusammengefasst und wiederum zu einem Droplet verpackt. Ein Droplet abstrahiert den zugrunde liegenden Code und stellt eine generische ausführbaren Code Einheit dar. Ein Droplet Execution Agent ist für die Ausführung des Codes innerhalb jedes Droplets verantwortlich und stellt das Betriebssystem und die Laufzeitumgebung bereit.

Fazit

Cloud Foundry ist ein schnell gewachsener und offener PaaS. Viele Hersteller haben ihre Unterstützung angekündigt und werden mit weiteren Plattformen und Services den Stack erweitern, was Cloud Foundry zu einer echten Alternative zu kommerziellen PaaS Angeboten wie Microsoft Windows Azure oder der Google App Engine werden lässt.



Amazon DynamoDB zusammen mit .NET nutzen

Amazon DynamoDB ist der aktuelle NoSQL Service der Amazon Web Services. Es handelt sich dabei um eine verwaltete, skalierbare und bei Bedarf nutzbare Datenbank inkl. bereitgestellten Durchsatz. Der Bereitgestellte Durchsatz ermittelt vorab die Anforderungen für den Lese-und Schreib-Durchsatz, auf deren Basis die Kosten berechnet werden.

Dieses Tutorial von cloudstory.in richtet sich an .NET Entwickler, die mit Amazon DynamoDB starten möchten. Es zeigt, wie eine Tabelle erstellt und darauf Operationen ausgeführt werden. Amazon DynamoDB bietet für .NET-Entwickler dazu eine Low-Level-API sowie eine Object-Persistence-API. Das Tutorial beschreibt, wie die Object-Persistence-API genutzt wird, um mit Amazon DynamoDB zu kommunizieren. Dazu wird als Beispiel eine DVD Bibliothek erstellt, mit der individuelle DVDs hinzugefügt, modifiziert, gesucht und gelöscht werden können.

Voraussetzungen

Schritt 1 – Einrichten der Umgebung

Zunächst wird in Visual Studio ein neues Projekt angelegt und die Umgebung eingerichtet.

Dazu muss eine Referenz zu der AWSSDK.dll hinzugefügt werden. Zu finden unter C:[*]Program Files[*]AWS SDK for .NET[*]bin.

[*] bitte durch einen SLASH ersetzen.

Anschließend wird eine neue Konfigurationsdatei für die Anwendung hinzugefügt. Als Standard-Dateiname kann App.config genommen werden.

Nun benötigen wir die AWS Anmeldedaten, also den AWS Access Key und Secret Key.

Wir fügen den folgenden "using" Ausdruck hinzu.

using Amazon.DynamoDB.DataModel;

Und übernehmen den AWS Access Key und Secret Key in die App.config Datei.

Schritt 2 – Erstellen des DVD-Schema

Als Nächstes wird eine Klasse angelegt, die für das Amazon DynamoDB Schema benötigt wird.

Dazu legen wir eine neue Klasse mit dem Namen DVD.cs an.

Und fügen den folgenden "using" Ausdruck hinzu.

using Amazon.DynamoDB.DataModel;

Wir fügen die folgenden Eigenschaften hinzu und überschreiben die ToString Methode.

public class DVD
{
    public string Title { get; set; }

    public int ReleaseYear { get; set; }

    public ListActorNames { get; set; }

    public string Director { get; set; }

    public string Producer { get; set; }

    public override string ToString(){
        return string.Format(@"{0} - {1} Actors: {2}", Title, ReleaseYear, string.Join(", ", ActorNames.ToArray()));}
    }
}

Nun müssen wir Amazon DynamoDB spezifische Attribute hinzufügen, um die Tabelle, den Hash Key und Range Key identifizieren zu können. Im Folgenden befindet sich der Code der endgültigen DVD.cs inkl. aller notwendigen Attribute.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Amazon.DynamoDB.DataModel;

namespace DVDsOnCloud
{
[DynamoDBTable("DVD")]
    public class DVD
    {
        [DynamoDBHashKey]
        public string Title { get; set; }

        [DynamoDBRangeKey]
        public int ReleaseYear { get; set; }

        [DynamoDBProperty]
        public List ActorNames { get; set; }

        public string Director { get; set; }

        public string Producer { get; set; }

        public override string ToString()
        {
            return string.Format(@"{0} - {1} Actors: {2}", Title, ReleaseYear, string.Join(", ", ActorNames.ToArray()));
        }
    }
}

Ein Hash Key ist vergleichbar mit dem Primary Key einer Tabelle. Es wird erwartet, dass dieser immer einzigartig ist und ist der am meisten genutzte Key für Anfragen. Der Range-Key ist ein sekundärer Schlüssel, der von DynamoDB verwendet wird, um einen sortierten Index-Bereich zu schaffen. Obwohl der Range Key optional ist, kann die Kombination von Hash Key und Range Key die Query-Performance optimieren.

Schritt 3 – Erstellen der DVDLibrary Hilfsklasse

Nun erstellen wir einen Wrapper für die DynamoDB API innerhalb einer Klasse, die von einem Client genutzt werden kann. Dazu erstellen wir eine neue Klasse mit dem Namen DVDLibray.cs.

Wir fügen die folgenden "using" Ausdrücke hinzu.

using Amazon;
using Amazon.DynamoDB;
using Amazon.DynamoDB.Model;
using Amazon.DynamoDB.DataModel;
using Amazon.SecurityToken;
using Amazon.Runtime;

Schritt 4 – Hinzufügen der öffentliche Mitglieder und des Konstruktors

Nun fügen wir den Konstruktor zur DVDLibrary Klasse hinzu. Der Konstruktor verwendet den AWS Security Token Authentifizierung, um die Anmeldedaten zu überprüfen.

AmazonDynamoDB client;
public DVDLibrary()
{
    AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient();
    RefreshingSessionAWSCredentials sessionCredentials = new RefreshingSessionAWSCredentials(stsClient);
    client = new AmazonDynamoDBClient(sessionCredentials);
}

Schritt 5 – Initialisierung der Amazonas DynamoDB Tabelle

In diesem Schritt initialisieren wir Amazon DynamoDB Tabelle. Wir stellen sicher, dass die Tabelle nicht existiert und erstellen eine neue. Zudem konfigurieren wir die benötigten Parameter, wie den bereitgestellten Durchsatz, Hash Key und Range Key. Das Erstellen einer Amazon DynamoDB Tabelle dauert eine Weile. Zu dieser Zeit können keine weiteren Operationen durchgeführt werden. Daher wird die Methode solange blockiert, bis der Status der Tabelle in den Zustand "Active" wechselt.

public void Init()
{
    List currentTables = client.ListTables().ListTablesResult.TableNames;
    if (!currentTables.Contains("DVD"))
    {
        CreateTableRequest reqCreateTable = new CreateTableRequest();
        CreateTableResponse resCreateTable=new CreateTableResponse();

        reqCreateTable.TableName = "DVD";

        reqCreateTable.ProvisionedThroughput = new ProvisionedThroughput();
        reqCreateTable.ProvisionedThroughput.ReadCapacityUnits=10;
        reqCreateTable.ProvisionedThroughput.WriteCapacityUnits=10;

        reqCreateTable.KeySchema = new KeySchema();

        reqCreateTable.KeySchema.HashKeyElement = new KeySchemaElement();
        reqCreateTable.KeySchema.HashKeyElement.AttributeName = "Title";
        reqCreateTable.KeySchema.HashKeyElement.AttributeType = "S";

        reqCreateTable.KeySchema.RangeKeyElement = new KeySchemaElement();
        reqCreateTable.KeySchema.RangeKeyElement.AttributeName = "ReleaseYear";
        reqCreateTable.KeySchema.RangeKeyElement.AttributeType = "N";

        resCreateTable = client.CreateTable(reqCreateTable);

        while (resCreateTable.CreateTableResult.TableDescription.TableStatus != "ACTIVE")
        {
            System.Threading.Thread.Sleep(5000);
        }
    }

}

Bei Amazon DynamoDB besteht die Möglichkeit, den Anforderungsdurchsatz festzulegen, den eine Tabelle erreichen soll. Der Service sorgt dann dafür, die Ressourcen bereitstehen, mit denen die erforderliche Durchsatzrate erreicht wird. Die Durchsatzanforderungen können in Bezug auf die Lesekapazität und Schreibkapazität in der Tabelle festgelegt werden. Dazu werden beim Erstellen einer Tabelle die erforderlichen Lese- und Schreibkapazitätsanforderungen angegeben. Auf dieser Basis partitioniert Amazon DynamoDB automatisch die entsprechende Anzahl von Ressourcen und reserviert diese, damit der Durchsatz erreicht wird.

Schritt 6 – Hinzufügen einer neuen DVD

Nun erstellen wir eine Funktion mit dem Namen AddDVD, die das DVD Objekt akzeptiert und ein Element in der Amazon DynamoDB erstellt.

public void AddDVD(DVD dvd)
{
    DynamoDBContext context = new DynamoDBContext(client);
    context.Save(dvd);
}

Schritt 7 – Ändern einer vorhandenen DVD

Als Nächstes erstellen wir eine Methode ModifyDVD, die versucht eine vorhandene DVD zu laden, diese zu modifizieren und anschließend zu speichern. Wird das Element nicht gefunden, kommt es zu einer Exception.

public void ModifyDVD(DVD dvd)
{
    DynamoDBContext context = new DynamoDBContext(client);
    DVD oDVD = context.Load(dvd.Title, dvd.ReleaseYear);
    if(oDVD==null)
        new Exception("Non-existent DVD");
    context.Save(dvd);
}

Schritt 8 – Alle DVDs ausgeben

Um alle DVDs auszugeben, führen wir einen Table Scan durch.

public IEnumerable GetAllDVDs()
{
    DynamoDBContext context = new DynamoDBContext(client);
    IEnumerable alldvds=context.Scan();
    return alldvds;
}

Wie bei jeder anderen Datenbank auch, ist ein vollständiger Scan auf Amazon DynamoDB kostspielig. Diese Operation berücksichtigt nicht den Hash Key und Range Key und durchläuft jedes Element. Der Scanvorgang wird beendet, wenn die aggregierte Größe der gescannten Objekte 1MB übersteigt. Der Client muss die Operation für den Rest der Elemente dann erneut starten.

Schritt 9 – DVDs auf Basis des Titels und Erscheinungsjahrs suchen

Um nach den DVDs zu suchen, benötigen wir den Hash Key als auch den Range Key. Daher wird diese Methode beide Schlüssel nutzen, um die DVDs zu durchsuchen.

public IEnumerable SearchDVDs(string title, int releaseyear)
{
    DynamoDBContext context = new DynamoDBContext(client);
    IEnumerable alldvds = context.Query(title, Amazon.DynamoDB.DocumentModel.QueryOperator.Equal, releaseyear);
    return alldvds;
}

Schritt 10 – DVDs auf Basis des Titels suchen

Wenn das Erscheinungsjahr nicht zu den Suchkriterien gehören soll, nutzen wir nur die folgende Methode, die nur auf Basis des Titels sucht.

public List>SearchDVDByTitle(string title)
{
    DynamoDBContext context = new DynamoDBContext(client);
    QueryRequest reqQuery = new QueryRequest();
    reqQuery.TableName = "DVD";
    reqQuery.HashKeyValue = new AttributeValue() { S = title };

    QueryResponse resQuery = client.Query(reqQuery);

    return resQuery.QueryResult.Items;
}

Schritt 11 – Löschen der DVD

Mit der folgenden Methode löschen wir eine DVD.

public void DeleteDVD(DVD dvd)
{
    DynamoDBContext context = new DynamoDBContext(client);
    DVD oDVD = context.Load(dvd.Title, dvd.ReleaseYear);
    if (oDVD == null)
        new Exception("Non-existent DVD");
    context.Delete(dvd);
}

Im Folgenden befindet sich der gesamte Quellcode für die DVDLibrary.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Amazon;
using Amazon.DynamoDB;
using Amazon.DynamoDB.Model;
using Amazon.DynamoDB.DataModel;
using Amazon.SecurityToken;
using Amazon.Runtime;

namespace DVDsOnCloud
{
    class DVDLibrary
    {
        AmazonDynamoDB client;
        public DVDLibrary()
        {
            AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient();
            RefreshingSessionAWSCredentials sessionCredentials = new RefreshingSessionAWSCredentials(stsClient);
            client = new AmazonDynamoDBClient(sessionCredentials);
        }

        public void Init()
        {
            List currentTables = client.ListTables().ListTablesResult.TableNames;
            if (!currentTables.Contains("DVD"))
            {
                CreateTableRequest reqCreateTable = new CreateTableRequest();
                CreateTableResponse resCreateTable=new CreateTableResponse();

                reqCreateTable.TableName = "DVD";

                reqCreateTable.ProvisionedThroughput = new ProvisionedThroughput();
                reqCreateTable.ProvisionedThroughput.ReadCapacityUnits=10;
                reqCreateTable.ProvisionedThroughput.WriteCapacityUnits=10;

                reqCreateTable.KeySchema = new KeySchema();

                reqCreateTable.KeySchema.HashKeyElement = new KeySchemaElement();
                reqCreateTable.KeySchema.HashKeyElement.AttributeName = "Title";
                reqCreateTable.KeySchema.HashKeyElement.AttributeType = "S";

                reqCreateTable.KeySchema.RangeKeyElement = new KeySchemaElement();
                reqCreateTable.KeySchema.RangeKeyElement.AttributeName = "ReleaseYear";
                reqCreateTable.KeySchema.RangeKeyElement.AttributeType = "N";

                resCreateTable = client.CreateTable(reqCreateTable);

                while (resCreateTable.CreateTableResult.TableDescription.TableStatus != "ACTIVE")
                {
                    System.Threading.Thread.Sleep(5000);
                }
            }

        }

public void AddDVD(DVD dvd)
{
    DynamoDBContext context = new DynamoDBContext(client);
    context.Save(dvd);
}

        public void ModifyDVD(DVD dvd)
        {
            DynamoDBContext context = new DynamoDBContext(client);
            DVD oDVD = context.Load(dvd.Title, dvd.ReleaseYear);
            if(oDVD==null)
                new Exception("Non-existent DVD");
            context.Save(dvd);
        }

        public IEnumerable GetAllDVDs()
        {
            DynamoDBContext context = new DynamoDBContext(client);
            IEnumerable alldvds=context.Scan();
            return alldvds;
        }

        public IEnumerable SearchDVDs(string title, int releaseyear)
        {
            DynamoDBContext context = new DynamoDBContext(client);
            IEnumerable alldvds = context.Query(title, Amazon.DynamoDB.DocumentModel.QueryOperator.Equal, releaseyear);
            return alldvds;
        }

        public List>SearchDVDByTitle(string title)
        {
            DynamoDBContext context = new DynamoDBContext(client);
            QueryRequest reqQuery = new QueryRequest();
            reqQuery.TableName = "DVD";
            reqQuery.HashKeyValue = new AttributeValue() { S = title };

            QueryResponse resQuery = client.Query(reqQuery);

            return resQuery.QueryResult.Items;
        }


        public void DeleteDVD(DVD dvd)
        {
            DynamoDBContext context = new DynamoDBContext(client);
            DVD oDVD = context.Load(dvd.Title, dvd.ReleaseYear);
            if (oDVD == null)
                new Exception("Non-existent DVD");
            context.Delete(dvd);
        }
    }

 }

Der komplette Quellcode

Im Folgenden ist der vollständige Code des Clients zu finden, der auf die DVDLibrary zugreift.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DVDsOnCloud
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create the helper object
            DVDLibrary DVDLib= new DVDLibrary();

            //Initialize
            DVDLib.Init();

            //Create the DVD object
            DVD dvd = new DVD() { Title = "Businessman", ReleaseYear = 2011, ActorNames = new List { "Mahesh", "Kajal" }, Director = "Puri Jagannath", Producer = "Venkat" };

            //Add the new DVD
            DVDLib.AddDVD(dvd);

            //Print all the DVDs
            foreach (var odvd in DVDLib.GetAllDVDs())
                Console.WriteLine(odvd.Title);

            //Create a new DVD object with modified values
            DVD newdvd = new DVD() { Title = "Businessman", ReleaseYear = 2011, ActorNames = new List { "Mahesh Babu", "Kajal Agarwal" }, Director = "Puri Jagannath", Producer = "Venkat" };

            //Commit the changes
            DVDLib.ModifyDVD(newdvd);


            //Search for the DVD
            foreach (var dvd in DVDLib.SearchDVDs("Businessman",2011))
                Console.WriteLine(dvd.Director);

            //Delete the DVD
            DVDLib.DeleteDVD(newdvd);
         }
    }
}

Quelle: http://cloudstory.in