.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Juli 2011

Webcast - Rx - Einstieg in die Programmierung asynchroner und event-basierter Anwendungen

25.07.2011 15:57:00 | Gregor Biswanger

silverlight-webcast_thumb2

Microsoft DevLabs hat ein Framework veröffentlicht, mit dem asynchrone und event-basierte Vorgänge reaktiv mittels LINQ gehandhabt werden können. Dieses Framework nennt sich Reactive Extensions (Rx), ist auch unter der Bezeichnung 'LINQ to Events' bekannt und kann kostenlos heruntergeladen werden. Mit ihm steht ein mächtiges Werkzeug bereit, das gerade bei asynchronen und eventbasierten Vorgängen seine Stärke ausspielen kann. Der Webcast bietet eine Einführung in die reaktive Programmierung mittels Rx.

image10

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487439

Übungen zum Webcast

Zu diesem Webcast habe ich ein paar Übungen vorbereitet. Somit stehen für Silverlight und WPF folgende Aufgaben zum Lösen bereit:

Rx unter Silverlight

Das Doppelklick-Feature kommt erst mit Silverlight 5. Bei der ersten Aufgabe geht es darum, eine einfache Doppelklick-Logik selbst zu implementieren:

   1:  namespace SilverlightDoubleClick
   2:  {
   3:      public partial class MainPage : UserControl
   4:      {
   5:          private readonly DispatcherTimer _doubleClickTimer;
   6:   
   7:          public MainPage()
   8:          {
   9:              InitializeComponent();
  10:   
  11:              _doubleClickTimer = new DispatcherTimer();
  12:          }
  13:   
  14:          private void BnClickMe_Click(object sender, RoutedEventArgs e)
  15:          {
  16:              if(_doubleClickTimer.IsEnabled)
  17:              {
  18:                  // TODO: Erst bei einem Doppelklick, darf dieser Code ausgeführt werden.
  19:                  // Hinweis! Verwende den _doubleClickTimer als Hilfe.
  20:                  MessageBox.Show("Doppelklick ausgeführt!");
  21:              }
  22:          }
  23:      }
  24:  }

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

Viel Spaß!

Euer Gregor

Webcast Serie: Einführung in die Workflow Foundation 4 – WCF Workflow Services

25.07.2011 15:55:02 | Gregor Biswanger

silverlight-webcast_thumb2

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

WCF Workflow Services

Datenkommunikation wird mittels WCF gehandhabt, dabei werden die Schnittstellen durch Contracts beschrieben. Die Implementierung greift anschließend auf die jeweiligen Komponenten zu. Somit dient die Implementierung der Contracts nur als Facade-Pattern. Mit der Workflow Foundation 4 können Datenkommunikationsprozesse bequemer und übersichtlicher definiert und erzeugt werden. Auch externe Web-Services können sehr einfach grafisch abgebildet werden. Der Webcast zeigt die Anwendung der WCF Workflow Services.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487438

Webcast Serie: Einführung in die Workflow Foundation 4 - Workflows persistieren

25.07.2011 15:52:47 | Gregor Biswanger

silverlight-webcast_thumb2

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

Workflows persistieren

Ein essentieller Schwerpunkt bei der Abarbeitung von Geschäftsprozessen ist die Ermittlung des Zustands der jeweiligen Situation. Wichtig ist dabei, diese Zustände auch zu behalten, falls sich die Ausführung der nächsten Prozesse auf unbestimmter Zeit verschieben sollte. Der Webcast vermittelt die Grundlagen zur Abspeicherung von Prozessen durch das Persistieren von Workflows.

image4

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487437

Zweite Auszeichnung zum Microsoft MVP!

25.07.2011 15:51:31 | Gregor Biswanger

MVPLogo_thumb2


Am Freitag (1.Juli 2011) hatte ich eine E-Mail erhalten, die mir das Wochenende versüßte:

Sehr geehrte(r) Gregor Biswanger,

herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2011 verleihen zu können! Diese Auszeichnung wird an herausragende, führende Mitglieder der technischen Communities verliehen, die ihre wertvollen praktischen Erfahrungen mit anderen Menschen teilen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema Client App Dev im vergangenen Jahr hoch ein.
...


Somit erhielt ich für ein weiteres Jahr eine MVP Auszeichnung zum Thema Client Application Development. Ich bin sehr stolz darauf und bedanke mich bei der ganzen Community, die sich für meine Vorträge, Artikel und Videos interessieren und mich durch Ihr Interesse immer mehr gepusht haben…

Natürlich auch ein großes Dankeschön an Microsoft, die meine Aktionen kräftig unterstützt haben.

Mit geballter Community Power wird es weiter gehen und ich stehe zum folgenden Motto:

Wie oft hört man "Man kann ja nicht allen Menschen auf der Welt helfen!" Na und? Helfen wir einem, und wenn wir dem geholfen haben, dann helfen wir dem nächsten...
© Wolfgang J. Reus, (1959 - 2006), deutscher Journalist, Satiriker, Aphoristiker und Lyriker


Gerne stehe ich für User Groups jeder Zeit kostenfrei für weitere Vorträge bereit. Dazu bitte einfach per E-Mail Kontakt mit mir aufnehmen.

image_thumb3

Vielen lieben Dank nochmal an alle, gemeinsam werden wir noch einiges zu Wege bringen!

Über 1 Jahr Silverlight Expertise und 32 gratis Silverlight How-To´s

25.07.2011 15:50:28 | Gregor Biswanger

dotnet-magazin-logo5

SNAGHTMLe5f110b8

Die Zeit vergeht wie im Flug und die Silverlight-Kolumne: Silverlight Expertise, ist nun schon über 1 Jahr alt. In der Zwischenzeit hat das dot.NET Magazin einige Artikel kostenfrei auf dotnet.de veröffentlicht. Diese möchte ich euch natürlich nicht vorenthalten und wünsche viel Spaß damit!

dot.NET Magazin Ausgabe 06/2011 - "Mirror Reflections von Images",
"Design-Time-freundliches ViewModel" und "Windows Phone 7 - Testen von WP7-Apps"

dot.NET Magazin Ausgabe 05/2011 - "Zugriff auf XML-Dateien",
"Logging unter Silverlight" und "Windows Phone 7 - Emmulator erkennen"

dot.NET Magazin Ausgabe 04/2011 - „E-Mail versenden“, „Reactive Coding
und “Windows Phone 7 - Emulator mit Tastatur bedienen

dot.NET Magazin Ausgabe 03/2011 - „Silverlight hat einen Timer“,
Default Button setzen“ und “Windows Phone 7 - Versteckte Emulator-Features

dot.NET Magazin Ausgabe 02/2011 - „Die AutoCompleteBox“,
Das Filtern von Daten“ und “Windows Phone 7 - Individueller Splashscreen

dot.NET Magazin Ausgabe 01/2011 - „Daten bei Datenbindung formatieren“,
XAP-Datei vor Hijacking schützen“ und “Windows Phone 7 - Page Navigation


dot.NET Magazin Ausgabe 12/2010 - „Datenfehler unter Expression Blend vermeiden“ und
Silverlight Unit Tests unter Continuous Integration Systeme

dot.NET Magazin Ausgabe 11/2010 - „Umlaute und Sonderzeichen in XAML
und „TextBox mit Wasserzeichen

dot.NET Magazin Ausgabe 09/2010 - „Text Trimming“ und „Bing Maps für Silverlight

dot.NET Magazin Ausgabe 07/2010 - „Statische Resourcen aus Assemblies
und „Popup-Hinweis zur unterstützen Bildschirmauflösung

dot.NET Magazin Ausgabe 06/2010 - „TextBlock-Texte selektierbar machen
und „Parameter an Silverlight übergeben


dot.NET Magazin Ausgabe 05/2010 - „Doppelklick implementieren
und „Der eigene Assembly Preloader


dot.NET Magazin Ausgabe 04/2010 - „Silverlight Install Experience ans eigene Design anpassen
und
WebBrowser-Steuerelement ab Silverlight 2 selbst schreiben

Webcast Serie: Einführung in die Workflow Foundation 4 – Bookmarks und Workflow Extensions

25.07.2011 15:48:07 | Gregor Biswanger

silverlight-webcast_thumb2

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

Bookmarks und Workflow Extensions

Eine große Stärke der Workflow Foundation 4.0 ist die flexible Handhabung komplexer Geschäftslogik. Dazu gehört etwa, dass unterschiedliche Prozesse eine unbestimmte Zeit andauern können. Dank der Bookmark-Funktionalität können Workflows auch an beliebiger Stelle fortgesetzt werden. Sollte jedoch ein Workflow interaktiv Informationen während der Abarbeitung außerhalb des Workflow-Hosters weitergeben können, hilft die Funktionalität der Workflow Extensions. Dieser Webcast durchleuchtet beide Bereiche im Detail.

image4

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487432

Webcast Serie: Einführung in die Workflow Foundation 4–Hosting und Activities

25.07.2011 15:46:49 | Gregor Biswanger

silverlight-webcast_thumb2

Seit letzter Woche gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

Hosting und Activities

Die Geschäftslogik kann auf dem Client oder direkt auf dem Server ausgeführt werden. Dazu müssen die Workflows entsprechend gehostet werden können. Für die jeweiligen Vorgänge kommen dann einzelne Activities zum Einsatz. Dieser Webcast geht auf beide Punkte im Detail ein und veranschaulicht die Verwendung der Workflow Foundation 4.0 unter Silverlight.

image4

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487431

Gemeinsamen Validation Style für Controls – WPF

23.07.2011 15:42:35 | Mario Priebe

Um einen gemeinsamen Style für Validierungsfehler in der WPF zu verwenden, definiert man einen Style für den TargetType Control und vergibt diesen einen Key. <Style x:Key="validationTriggerBase" TargetType="Control"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent }" /> </Trigger> </Style.Triggers> </Style> <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource validationTriggerBase}" /> Viel Spaß beim entwickeln : ) Dieser [...]

Programmatisch auf Team Foundation Server 2010 zugreifen? TFS Managed Object Model? TFS SDK for Java? OData?

22.07.2011 22:10:00 | Christian Binder

In vielen Fällen möchte man auf die TFS Services, wie Version Control. Workitems, Builds  programmatisch zugreifen, um z.B. ein anderes Werkzeug zu integrieren oder ein anderen Client zu entwickeln. In diesem Beitrag möchte ich kurz die Möglichkeiten aufführen und in diesem Kontext auch den OData Service für TFS 2010 Beta vorstellen als auch Tipps geben, wie man diesen lokal auf seinem Client einfach Testen kann. Und mit TFS on the Road gibt es jetzt schon die erste Windows Phone 7 App für den TFS, die auf OData basiert.

Grundsätzlich besteht der TFS aus einer Application Tier und einer Data Tier, wobei die Application Tier die Services als SOAP Webservices zur Verfügung stellt. Welche Optionen habe ich nun diese Webservices zu konsumieren?

1) Plattformen , für die das .NET Framework verfügbar ist, empfiehlt sich der Zugriff über das Managed TFS Object Model. Ein Einführung finden Sie hier.

2) Plattformen , für welche die Java Runtime verfügbar ist, kann der Zugriff mit dem Team Foundation Server SDK for Java durchgeführt werden.

3) Webservices direkt konsumieren ist Supportet, wobei keine aktuelle MSDN Dokumentation existiert. Empfohlen und viel einfacher zu nutzen sind die anderen Ansätze.

4) NEU ist der OData Service für TFS 2010 Beta für alle Devices und Plattformen für die 1) oder 2) keine Option sind. Wobei die Beta nicht den gleichen Funktionsumfang wie 1) bzw. 2) unterstützt.

OData = Open Data Protocol ist ein offener Standard, der den HTTP Stack voraussetzt und so keine Voraussetzungen für Runtimes usw. mit bringt. Auf diese Weise  können auch Devices, die 1) oder 2) nicht unterstützen auf die TFS Services zugreifen. Der OData Service für TFS 2010 Beta implementiert OData und nutzt das TFS Object Model, um mit den TFS Services zu interagieren. Ist also ein zusätzlicher Service. Der Code steht hier zum Download bereit. In der Solution ist der Service als Azure Projekt implementiert und könnte so mit geringem Aufwand direkt publiziert werden. Ein bereits vorhandener TFS könnte dann auch via OData genutzt werden. Die Dokumentation erklärt die dazu notwendigen Anpassungen. Zudem gibt es ein Video von Brian Keller, dass einen guten Überblick liefert.

Hier noch Tipps, wie man als Entwickler den OData Service for TFS 2010 auch auf seinem lokalen Win7 testen kann. Ich habe auf meinem Win7 Client den TFS in der Basic Konfiguration lokal laufen. Dann die Solution etwas simplifiziert, da ich den Service auf dem lokalen IIS hosten möchte:

image

Hierzu habe ich die Projekt Eigenschaften von ODataTFS.Web geändert, so dass der lokale IIS verwendet  wird:

image

Die WebConfig angepasst:
1)  Sektion <system.diagnostics> auskommentiert, da ich in dieser Konstellation kein Azure Tracing benötige. 

2) In Sektion <system.web>  hinzugefügt :
<anonymousIdentification enabled="false"/>
<authentication mode="Windows" />

3) In Sektion <appSettings> auf meinen lokalen TFS Server angepasst:
<add key="ODataTFS.TfsServer" value=http://DeinTFS:8080/tfs />

4) In Section<system.webServer> folgende Sektionen auskommentiert, da ich ohne SSL lokal Testen möchte:   
<staticContent>
<handlers>


Hinweis:
Nur für Testsysteme mit Test Accounts. Ansonsten ist HTTPS sprich SSL aus Sicherheitsgründen erforderlich!

Nun kann der Service direkt im Browser getestet werden:

image

Da das Managed TFS Object Model auf dem Windows Phone 7 nicht zur Verfügung steht, bietet sich OData als Beispiel an, um auf den TFS vom Phone aus zuzugreifen. Der Code ist im Download mit enthalten und kann direkt im Emulator gestartet werden:

image

Und wie schon am Anfang angekündigt, hat Pedro Castelo direkt mal eine cool App für das Windows Phone 7 “TFS on the Road” basierend auf OData for TFS geschrieben, die kostenfrei im Marketplace hier zur Verfügung steht. Der Souce Code ist ebenfalls auf Codeplex frei verfügbar.  Codeplex selbst hat den OData Service schon implementiert, so dass man auf alle Projekte, für die man Zugriff hat mit TFS on the Road via Phone zugreifen kann. Details zur App gibt’s hier.

051411_1824_tfsontheroa52051411_1824_tfsontheroa192051411_1824_tfsontheroa142

Die Navigation Map von TFS on the Road:

051411_1824_tfsontheroa113

Viel Spass

Einführung in die Workflow Foundation 4

22.07.2011 13:31:46 | Christian Binder

Gregor Biswanger (MVP) hat eine WebcastSerie zur Workflow Foundation 4 publiziert, die Einsteigern eine ideale Grundlage bietet, sich mir WF4 vertraut zu machen. WF4 ist auch der zentrale Workflow für Team Build im Team Foundation Server 2010, so dass die Serie für die Anpassungen an Team Build eine gute Grundlage ist und in Verbindung mit dem Visual Studio 2010 Build Customization Guide eine hilfreiche Ressource.

image

Zur WF4 Serie geht’s hier.

Viel Spass

Reactive Extensions (Rx) – FromEvent und FromEventPattern

22.07.2011 13:27:01 | Gregor Biswanger

Rx_Logo_small

Reactive Extensions (Kurz Rx) ermöglicht das abonnieren von Events. Die eingehenden Daten (EventArgs) werden dann mittels IObservable als Datenstream weitergereicht (push). Die Assertion und/oder Komposition findet dann mittels LINQ statt. Auch Abhängigkeiten zu anderen Events können definiert werden. Das macht Rx zum umschlagbaren .NET-Feature.

Etwas verwirrender ist dabei, das Rx zwei unterschiedliche Methoden dafür zur Verfügung stellt: FromEvent und FromEventPattern.

 

FromEvent

Ab dem .NET-Framework 3.5 mit C# 3.0 ist ein neuer Delegat dazugekommen: Der Action-Delegat.

Bei Action handelt es sich somit um ein generisches Delegate. Unter .NET-Entwicklern hat dieses Delegate immer mehr an Beliebtheit gefunden. Denn somit wird das schreiben für Events um einiges erleichtert. Denn das schreiben eigener EventHandler und die Abhängigkeit zum Standard EventHandler entfällt. Soll zudem ein Wert als EventArgs übertragen werden, reicht das Zuweisen des Datentyps mittels Generics.

 

   1:  class Program
   2:  {
   3:      public static event Action<string> IncomingMessage;
   4:   
   5:      public static void InvokeMessage(string message)
   6:      {
   7:          Action<string> handler = IncomingMessage;
   8:          if (handler != null) handler(message);
   9:      }
  10:   
  11:      static void Main(string[] args)
  12:      {
  13:          IncomingMessage += OnIncomingMessage;
  14:   
  15:          InvokeMessage("Hello World");
  16:   
  17:          Console.ReadLine();
  18:      }
  19:   
  20:      static void OnIncomingMessage(string value)
  21:      {
  22:          Console.WriteLine(value);
  23:      }
  24:  }

 

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

 

Viel Spaß!

Euer Gregor

.NET-Architektur mit dem Beispiel „GoFish“ – Design und Development

22.07.2011 13:27:01 | Gregor Biswanger

gofish-1_thumb1In der ersten Folge dieser Architektur-Serie, haben wir die Phasen Vision, Diagnose und Analyse kennengelernt. Dabei wurde auf das Thema Kommunikation eingegangen und das diese durch Metaphorik (Zum Beispiel durch die Common Language) vereinheitlicht wird. Es begann mit Sketching, Modellierung und endete mit Prototyping.

In diesem Teil wird die Design- und Development-Phase vorgestellt, womit das Ziel mit dem Spiel „GoFish“ immer näher rückt.

 

 

 

Das Design

image


Wir beginnen mit der Design-Phase. Auch Entwurfsphase genannt.

  • Ziel der Design Phase ist die Festlegung, wie die Geschäftsanforderungen zu implementieren sind. Diese Phase konzentriert sich in erster Linie auf den Entwurf und die Einschätzung des erforderlichen Aufwands für die Entwicklung individueller Anpassungen.
  • Die wichtigsten Zielvorgaben sind produktspezifische, detaillierte Designspezifikationen, sowie Test Case Dokumente, welche die Funktionstests spezifizieren.

 

Die Abstraktion der Anforderungen

Die bisherigen Phasen konnten beim Auffinden der Anforderungen bestens weiterhelfen. In der Regel werden bereits beim Aufbau der “Common Language” sogenannte “User Stories” vom Kunden beschrieben. Das Schreiben von User-Stories verlangt allerdings eine Art Disziplin. Sie sollten in der Sprache des Kunden liegen. Daher sollen technische Aspekte auf keinen Fall enthalten sein. Genau aus diesem Grund, sollte auch der Kunde „eigentlich“ selbst die User-Stories schreiben.

 

image

Abbildung 1 – Die Abstraktionspyramide

Ein Beispiel als User-Story: „Beim Spielstart werden 52 Karten gemischt.“

Nun hat der Kunde seinen Prototyp erhalten und kann mittels SketchFlow-Player direkt Feedback an den Designer abgeben. Gleichzeitig wird der Entwickler mit der Abstraktion der Anwendungsfälle (User-Stories) zu einzelnen Tasks beginnen. Diese Tasks beschreiben die benötigten Schritte um die Anforderung zu erfüllen.

Als Beispiel sind hier die Tasks zur oben angezeigten User-Story gelistet:

1: Modellieren

2: Code generieren / anlegen

3: Anforderung via Test festlegen

4: Logik implementieren

5: Logik mit anderer Logik koppeln

Schnell wird ersichtlich, dass aus einer einfachen Anforderung viele Tasks entstehen. Anschließend können die User-Stories noch vom Kunden priorisiert und die Tasks vom Entwickler-Team geschätzt werden. Wichtig! Aus Zeitgründen muss oft schon auf User-Story-Ebene eine Zeitschätzung stattfinden, welche dadurch ungenau ausfällt . Zum Schätzen der Zeit kann ich Planning-Poker bestens empfehlen.

Für “GoFish” hatte ich keine User-Stories und Tasks eingeplant. In der Regel erstelle ich für meine privaten Projekte immer eine Art User-Stories und Tasks. Es kann auch nur zur stätigen Übung für sich selbst dienen. Allerdings soll diese Architekturserie nicht den Rahmen sprengen. Zur weiteren Arbeit reichen die Aktivitätsdiagramme und das Komponentendiagramm bestens aus.

 

Komponentendiagramm

Die Design-Phase hat nichts mit dem „Aussehen“, sondern mit dem „entwerfen“ der Software zu tun. In dieser Phase sollten alle Anforderungen weit möglichst bekannt sein. Jetzt gilt es diese Anforderungen in Komponenten aufzuteilen. Somit erhalten wir für unsere Architektur eine Flexibilität und bleiben jederzeit offen für Erweiterungen.

Eine Komponente ist eine modulare Einheit, die innerhalb ihrer Umgebung austauschbar ist. Die internen Daten sind ausgeblendet, aber Komponenten verfügen über eine oder mehrere klar definierte Schnittstellen, über die auf die Funktionen zugegriffen werden kann.

Zum Designen der Komponenten, verwende ich das Komponentendiagramm (engl. component diagram - UML). Auch dieses UML-Diagramm ist in den Architecture Tools von Visual Studio 2010 Ultimate enthalten.

Das Zeichnen von Komponentendiagrammen hat mehrere Vorteile:

  • Bei einem Komponentendiagramm werden die Abhängigkeiten der Komponenten untereinander ersichtlicher.
  • Wenn sich das Entwicklungsteam auf die Hauptblöcke eines Entwurfs konzentriert, kann es ein besseres Verständnis des vorhandenen Entwurfs entwickeln und einen entsprechenden neuen Entwurf erstellen.
  • Indem Sie sich Ihr System als Auflistung von Komponenten mit klar definierten, angebotenen und erforderlichen Schnittstellen vorstellen, optimieren Sie die Abgrenzung zwischen den Komponenten. Dadurch ist der Entwurf einfacher zu verstehen, und er kann bei sich ändernden Anforderungen auch einfacher angepasst werden.
  • Der Entwurf dient später auch für ein „Design by contract“. Womit Schnittstellen (Interfaces) für die Komponenten angelegt werden. Diese dienen dann als Vertrag (contract) für das gesamte Entwicklerteam.

 

Als Vorlage zum Modellieren der Komponenten, dienen die bereits erzeugten Workflows (Aktivitätsdiagramme). Hieraus erstellte ich pro Aktivität eine eigene Komponente. Die Schnittstelle der Komponenten war aus dem Domänenmodell bezogen und wurde somit immer auf eine Liste von Spielkarten (List<Card>) definiert. Dabei betrachtete ich das Expert-Muster, welches besagt: „Eine Aufgabe sollte von der Entität ausgeführt werden, die im Bezug darauf Experte ist.“.

Allerdings sollen Entities keinerlei Logik beinhalten und als einfache POCO‘s (Plain old CLR Object’s) behandelt werden. Als Lösung für die meisten Anforderungen von “GoFish”, eignen sich Extension-Methods geradezu ideal.

Normal steht eine Schnittstelle für eine Methode, so wie es beim CardsGenerator mit der Methode GetCards demonstriert wird (siehe Abbildung 2). Da ich allerdings später die Logik mittels Workflow Foundation 4 koppeln möchte, wird zu jeder Funktion eine weitere Facade-Komponente entwickelt. Womit ich bei der Extension-Methods-Lösung zufrieden bin.

 

SNAGHTML860a8d

Abbildung 2 – Aus den Aktivitäten der Workflows werden Komponenten angelegt.

 

Die einzelnen „Extension-Methods“-Komponenten verschachtel ich in eine CardsExtensionMethods-Komponente und definiere nur noch die Schnittstellen. Somit befinden sich die Funktionalitäten wieder in einem eigenen Kontext.

 

image

Abbildung 3 – Viele einzelne Komponenten werden zu einer kombiniert.

 

Die Schichtenarchitektur

Wobei jetzt grob die einzelnen Funktionalitäten definiert wurden, soll nun ein Schema der Architekturart folgen. Das wird in der Regel auch als Erstes modelliert. Bei diesem Spiel handelt es sich um einen Fat Client. Dabei soll die Schichtenarchitektur als fundamentale Grundlage dienen. Die Schichtenarchitektur bezeichnet grundsätzlich ein Architekturmuster, worin einzelne Aspekte des Softwaresystems konzeptionell einer Schicht (engl. layer) zugeordnet werden. Die erlaubten Abhängigkeitsbeziehungen zwischen den Aspekten werden bei einer Schichtenarchitektur dahingehend eingeschränkt, dass Aspekte einer „höheren“ Schicht nur solche „tieferer“ Schichten verwenden dürfen. Ein System mit einer Schichtenarchitektur bezeichnet man auch als mehrschichtig.
 
Die den Schichten zugeordneten Aspekte können dabei je nach Art des Systems oder Detaillierungsgrad der Betrachtung z. B. Funktionalitäten, Komponenten oder Klassen sein. Ich verwende für jede Schicht ein eigenes Assembly-Projekt. Das ermöglicht einen hohen Grad von Abstraktion und Austauschbarkeit. Womit eine hohe Flexibilität der Architektur gegeben wird.

Mein Tipp! HowTo: 3-Tier / 3-Schichten Architektur und  Ist eine 3 Schichten Architektur mit eigener DAL immer empfehlenswert?

 

Das 2- oder 3-Schichten-Modell?

Die erste Schicht besteht immer aus der auszuführenden Assembly (*.exe). In diesem Fall handelt es sich demnach um ein WPF-Projekt. Die zweite Domain-Schicht beinhaltet die Spielablauflogik. Im Geschäftsumfeld auch als Businesslogic bekannt, welche hier den Ablauf der Geschäftslogik regeln würde (zum Beispiel Zustandsvalidierungen, Berechnungen etc.). Die letzte Schicht ist in der Regel die Datenschicht (DataAccessLayer). Allerdings steht nirgends bei den Anforderungen beschrieben, dass Informationen persistent gespeichert werden sollen, womit auch eine Planung mit einem 2-Schichten Modell vollkommen ausreicht. Die zwei Schichten benötigen allerdings die Daten vom DomainModel (Entities), Contracts (Interfaces), Handler, Services, Aspekte und vieles weitere. Wenn diese Daten in der ersten Schicht untergebracht werden, müsste die zweite Schicht darauf referenzieren, was laut der Schichtenarchitektur strikt untersagt ist. Zudem muss die erste Schicht auch die Funktionen der zweiten aufrufen können. Explizit dafür wird eine weitere Querschicht GoFish.Common hinzugefügt. Jede Schicht ist somit verpflichtet die Common-Layer zu referenzieren.

Für jede Schicht wird eine Komponente angelegt und bekommt den Titel der späteren Assembly.

image

Abbildung 4 – Passend zum Komponentendiagramm werden neue Projekte angelegt. Diese fungieren jeweils als Layer (Schicht).

 

Das Ebenendiagramm (Layer-Diagram)

Für eine bessere visuelle Darstellung der Schichten, gibt es das Layer-Diagram. Auch dieses UML-Diagramm ist in den Architecture Tools von Visual Studio 2010 Ultimate enthalten. Sie können mit dem Layer-Diagram die vorgesehenen oder vorhandenen Abhängigkeiten zwischen bestimmten Schichten darstellen. Diese Abhängigkeiten geben an, welche Schichten die Funktionen auf anderen Schichten verwenden können oder gegenwärtig verwenden. Durch das Gliedern des Systems in Schichten, die verschiedene Rollen und Funktionen beschreiben, kann ein Ebenendiagramm das Verstehen, Wiederverwenden und Verwalten des Codes für Sie erleichtern.

Sie können mit einem Ebenendiagramm die folgenden Aufgaben ausführen:

  • Angeben der vorhandenen oder vorgesehenen logischen Architektur des Systems
  • Ermitteln von Konflikten zwischen dem vorhandenen Code und der vorgesehenen Architektur
  • Visualisieren der Auswirkungen von Änderungen an der vorgesehenen Struktur, wenn Sie das System umgestalten, aktualisieren oder weiterentwickeln
  • Erzwingen der vorgesehenen Architektur während der Entwicklung und Wartung des Codes, indem Sie in die Eincheck- und Buildvorgänge Validierung einschließen

 

image

Abbildung 5 – Die Schichten visuell darstellen mit dem Layer-Diagram. Die erlaubte Abhängigkeit wird durch Pfeile dargestellt.

 

Mein Tipp! Visual Studio 2010: Architektur-Validierung - Arbeiten mit Layerdiagrammen

 

Modellgetriebene Architektur (Model Driven Architecture, MDA)

Ein Teil der modellgetriebenen Architektur ist die modellgetriebene Softwareentwicklung (MDSD). MDSD (Model Driven Software Development) bezeichnet die Verwendung von Modellen und Generatoren zur Verbesserung der Softwareentwicklung. Schon in den Anfangszeiten der Informatik stützte man sich auf Modelle und entwickelte Generatoren, um schematischen Quellcode daraus zu erzeugen.

DomainModel zu Entities generieren

Beim Projekt “GoFish” kann ebenfalls ein minimaler Teil von MDSD mit den bereits erzeugten UML-Diagrammen genutzt werden. So lässt sich das DomainModel nun in Entity-Klassen generieren.

Wichtig! Hierfür muss vorher das Visual Studio 2010 Feature Pack installiert werden. Ansonsten ist die Funktionalität nicht vorhanden.

Um jetzt den Code generieren zu lassen, wird das DomainModel-Diagram geöffnet. Im Drop-Down-Menü vom Designer (Rechtsklick auf eine freie Fläche), wird der Menüpunkt “Generate Code” angeboten (siehe Abbildung 6).

 

 

image

Abbildung 6 – Aus dem Visual Studio 2010 UML-Designer den Code generieren lassen.

 

Etwas unschön ist, dass die Klassen willkürlich im eigenen Projekt erzeugt wurden. Jedoch erwartet man nach der Schichtenarchitektur, das die Entities in die GoFish.Common-Schicht unter dem Verzeichnis Entities generiert werden. Diesen Wunsch kann man unter Visual Studio 2010 selbst konfigurieren. Eine Konfiguration wird auch Projektspezifisch durchgeführt. Daher müssen bei einem neuen Projekt die Einstellungen wiederholt angepasst werden. Die Konfiguration befindet sich in Visual Studio 2010 im Menüpunkt “Architecure – Configure Default Code Generation Settings…” – (siehe Abbildung 7).

 

image

Abbildung 7 – Die Code Generation Settings öffnen.

 

In der “Code Generation”-Konfiguration müssen vom ClassTemplate die Properties “Project Path” und “Target Directory”, wie unter Abbildung 8 geändert werden.

 

SNAGHTML5ffb653

Abbildung 8 – Die Code Generation Settings.

 

Anschließend wird der Code “fast” wie erwünscht im Projekt erzeugt. Die einzige Kritik meinerseits ist, dass die Namespace-Definition der generierten Klassen fehlt. Man muss daher selbst im T4-Template diesen Wunsch einbauen (siehe Abbildung 8 – Template File Path). Ich hatte “etwas unschön” mit ReSharper manuell die Entities mit dem fehlenden Namespace erweitern lassen. Bei einer wiederholten Code Generierung müsste ich diesen Schritt erneut ausführen.

 

image

Abbildung 9 – Die vom DomainModel generierten Entity-Klassen.

 

Leider können allerdings vom Komponentenmodell keine Interfaces (Contracts) generiert werden. Diese erzeugte ich anhand des Diagramms manuell. Ich habe die Contracts erzeugt, die laut Komponentendiagramm instanziiert werden müssen. Das Projekt hat nun durch die Design-Phase seine Infrastruktur erhalten. Auch Interfaces (Contracts) und Entities wurden angelegt.

 

image

Abbildung 10 – Die erste Projektinfrastruktur, Entities und Contracts von GoFish sind nun fertiggestellt.

 

Development

image

Wir beginnen mit der Development-Phase, auch Entwicklungsphase genannt.

  • Ziel der Development Phase ist es, die in den Designspezifikationen festgelegten und genehmigten Anpassungen, Berichte, Integrationen und Datenmigrationsprozesse zu entwickeln und zu testen.
  • Die wichtigsten Zielvorgaben sind die getesteten und überprüften Komponenten und Prozesse.

 

Testgetriebene Entwicklung (engl. Test-Driven Development (TDD))

Für die Planung sind nun alle wichtigen Aspekte erfüllt worden. Ich habe mir nun eine Vorlage von Klassen und Interfaces angelegt, und muss nur noch die Logik dazu implementieren. Als Entwicklungsstil verwende ich schon seit Jahren die testgetriebene Entwicklung (Test-Driven Development, kurz TDD). Bei TDD wird vor der Implementierung der Logik, ein Unit-Test geschrieben. Diese sollen unter TDD die funktionale Anforderung einer Komponente sicherstellen. Im Gegenteil zu klassischen Unit-Tests, die Komponenten nur auf Seiten Effekte testen. Somit wird das “Test” von Test-Driven Development gerne verwechselt und Anhänger dieser Praxis haben daher eine Ergänzung mit Behavior-Driven Development (BDD) ins Leben gerufen. Für klassische Unit-Tests gibt es bereits zahlreiche Tools, die automatisch einen passenden Test Code zur Komponente generieren (siehe zum Beispiel Microsoft Pex).


Mein Tipp!
Unit-Test Generierung mit PEX - Whitebox Testing

 

Als Unit-Test Framework habe ich mich für das Open-Source Framework NUnit entschieden.

 

Hier nochmal der TDD Prozess im Detail:

  1. Schreibe den Testcode
  2. Mache ihn kompilierbar
  3. Starte den Test und lasse ihn fehlschlagen
  4. Setze nur die Anforderung um, damit der Test abgedeckt ist
  5. Starte den Test und prüfe, ob er erfolgreich ist
  6. Refactore den Code zur besseren Übersichtlichkeit und Vermeidung von Coderedundanzen
  7. Starte von Vorne mit dem nächsten Test

 

Also begann ich erst mit dem Schreiben der Tests. Welche Funktionen getestet/implementiert werden müssen, beschreibt uns das Komponentendiagramm (siehe Abbildung 11).

 

image

Abbildung 11 – Die beschriebenen Schnittstellen vom Komponentendiagramm werden mittels “Test-First” implementiert.

 

Beim Schreiben von Unit-Tests gibt es eigene Prinzipien zu beachten, die sich mit gängigen OOP-Prinzipien unterscheiden. Eines davon wäre die AAA-Syntax. (Weitere Infos darüber unter: TDD – Probleme vermeiden mit der AAA-Syntax). Den Source-Code für die Unit-Tests stehen unter Listing 1 & 2.


Mein Tipp! TDD Anti-Patterns - Am schlechten Beispiel lernen

 

   1:  using System.Collections.Generic;
   2:  using GoFish.Common.Entities;
   3:  using GoFish.Common.Extensions;
   4:  using GoFish.Domain;
   5:  using NUnit.Framework;
   6:   
   7:  namespace GoFishGame.Tests
   8:  {
   9:      [TestFixture]
  10:      public class GameSetUpTests
  11:      {
  12:          [Test]
  13:          public void GetCards_ShouldBeGetFiftyTwoCardsWithNonDublicate()
  14:          {
  15:              // Arrange
  16:              CardsGenerator cardsGenerator = new CardsGenerator();
  17:   
  18:              // Act
  19:              List<Card> results = cardsGenerator.GetCards();
  20:   
  21:              // Assert
  22:              Assert.AreEqual(52, results.Count);
  23:              
  24:              CardDublicateCheck(results);
  25:          }
  26:   
  27:          [Test]
  28:          public void GetFiveRandomCards_ShouldBeFiveNonDublicateCards()
  29:          {
  30:              // Arrange
  31:              CardsGenerator cardsGenerator = new CardsGenerator();
  32:              List<Card> results = cardsGenerator.GetCards();
  33:   
  34:              // Act
  35:              List<Card> randomKarten = results.GetFiveRandomCards();
  36:   
  37:              // Assert
  38:              Assert.AreEqual(randomKarten.Count, 5);
  39:              Assert.AreEqual(results.Count, 47);
  40:   
  41:              CardDublicateCheck(randomKarten);
  42:          }
  43:   
  44:          private static void CardDublicateCheck(List<Card> results)
  45:          {
  46:              foreach (Card card in results)
  47:              {
  48:                  var containsCount = results.FindAll(x => x == card);
  49:   
  50:                  if (containsCount.Count > 1)
  51:                      Assert.Fail("Card is dublicate");
  52:              }
  53:          }
  54:      }
  55:  }

 

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

 

Viel Spaß!

Euer Gregor

Access denied due to invalid credentials - aber nur manchmal?

22.07.2011 13:08:00 | Martin Hey

Heute bin ich über ein sehr seltsames Phänomen gestolpert. Gesetzt ist eine ASP.NET MVC3 Anwendung. Im Debug auf dem lokalen IISExpress läuft diese auch wunderbar, und auch auf der Testumgebung (einem Windows Server 2008) läuft die Anwendung - zumindest so lange man mit localhost darauf zugreift. Alle Zugriffe über die IP-Adresse des Servers enden mit einem 401er-Fehler - und das sowohl von anderen Rechnern aus als auch vom Server selbst.

Und das Seltsame daran: Es betrifft auch nur diese eine Anwendung - alle anderen auf diesem Server laufenden Web-Anwendungen laufen problemlos und sind auch Remote erreichbar. Nach mehreren erfolglosen Einstellungsversuchen im IIS7 - Bindings, Berechtigungen und was man sonst alles falsch machen kann, IIS-Neustarts und sogar Serverneustarts ändert sich am Problem trotzdem nichts. Der Zugriff über localhost funktioniert, aber der Zugriff über die IP-Adresse eben nicht.

Letztendlich brachte ein Blogeintrag von John Tindell die rettende Lösung - und auch wenn mir wirklich unklar ist, WARUM das funktioniert - es funktioniert.

Lösung: Fügt man in der web.config im Bereich system.webServer den folgenden Eintrag hinzu und ruft die Seite dann nochmals auf, so funktioniert der Aufruf nun auch mit der IP-Adresse:

<httpErrors errorMode="Details" />

Seltsam daran: Dieser Eintrag hat eigentlich nur etwas damit zu tun, wie das Error-Handling für die Anwendung ist und wie demzufolge Fehlermeldungen ausgegeben werden. Detailed Errors anzuschalten kann natürlich nicht die Lösung sein, da man auf extern erreichbaren Servern natürlich keine Interna des Webservers und der Applikationsstruktur preisgeben möchte. Deswegen kann das noch nicht die finale Lösung sein.

Webcast Serie: Einführung in die Workflow Foundation 4 – WCF Workflow Services

22.07.2011 12:35:37 | Gregor Biswanger

silverlight-webcast

 

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

 

WCF Workflow Services

Datenkommunikation wird mittels WCF gehandhabt, dabei werden die Schnittstellen durch Contracts beschrieben. Die Implementierung greift anschließend auf die jeweiligen Komponenten zu. Somit dient die Implementierung der Contracts nur als Facade-Pattern. Mit der Workflow Foundation 4 können Datenkommunikationsprozesse bequemer und übersichtlicher definiert und erzeugt werden. Auch externe Web-Services können sehr einfach grafisch abgebildet werden. Der Webcast zeigt die Anwendung der WCF Workflow Services.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487438

Webcast - Rx - Einstieg in die Programmierung asynchroner und event-basierter Anwendungen

22.07.2011 12:27:01 | Gregor Biswanger

silverlight-webcast

Microsoft DevLabs hat ein Framework veröffentlicht, mit dem asynchrone und event-basierte Vorgänge reaktiv mittels LINQ gehandhabt werden können. Dieses Framework nennt sich Reactive Extensions (Rx), ist auch unter der Bezeichnung 'LINQ to Events' bekannt und kann kostenlos heruntergeladen werden. Mit ihm steht ein mächtiges Werkzeug bereit, das gerade bei asynchronen und eventbasierten Vorgängen seine Stärke ausspielen kann. Der Webcast bietet eine Einführung in die reaktive Programmierung mittels Rx.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487439

 

Übungen zum Webcast

Zu diesem Webcast habe ich ein paar Übungen vorbereitet. Somit stehen für Silverlight und WPF folgende Aufgaben zum Lösen bereit:

Rx unter Silverlight

Das Doppelklick-Feature kommt erst mit Silverlight 5. Bei der ersten Aufgabe geht es darum, eine einfache Doppelklick-Logik selbst zu implementieren:

   1:  namespace SilverlightDoubleClick
   2:  {
   3:      public partial class MainPage : UserControl
   4:      {
   5:          private readonly DispatcherTimer _doubleClickTimer;
   6:   
   7:          public MainPage()
   8:          {
   9:              InitializeComponent();
  10:   
  11:              _doubleClickTimer = new DispatcherTimer();
  12:          }
  13:   
  14:          private void BnClickMe_Click(object sender, RoutedEventArgs e)
  15:          {
  16:              if(_doubleClickTimer.IsEnabled)
  17:              {
  18:                  // TODO: Erst bei einem Doppelklick, darf dieser Code ausgeführt werden.
  19:                  // Hinweis! Verwende den _doubleClickTimer als Hilfe.
  20:                  MessageBox.Show("Doppelklick ausgeführt!");
  21:              }
  22:          }
  23:      }
  24:  }

 

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

 

Viel Spaß!

Euer Gregor

Rx – Lösung zur ersten Webcast-Übung

22.07.2011 12:27:01 | Gregor Biswanger

imageBeim Webcast “Einstieg in die Programmierung asynchroner und event-basierter Anwendungen”, stellte ich zwei Übungen zum Einstieg in Rx (Reactive Extensions) bereit.

Die erste Übung beschäftige sich hauptsächlich mit Rx unter Silverlight. Hier sollte eine Doppelklick-Logik für einen Button implementiert werden. Einmal auf den “normalen” Lösungsweg und zum zweiten mit Hilfe von den Reactive Extensions.

Zur ersten Aufgabe hatte ich bereits dem dot.net-Magazin eine Lösung bei der Kolumne “Silverlight Expertise” veröffentlicht gehabt, das auch schon Online frei ersichtlich ist: “Silverlight: Doppelt klicken, einfach laden”.

 

 

 

Silverlight - Klassische Doppelklick-Logik

 

   1:  namespace SilverlightApplication
   2:  {
   3:    public partial class MainPage : UserControl
   4:    {
   5:      private DispatcherTimer _doubleClickTimer;
   6:   
   7:      public MainPage()
   8:      {
   9:          InitializeComponent();
  10:   
  11:          _doubleClickTimer = new DispatcherTimer();
  12:          _doubleClickTimer.Interval = new TimeSpan(0, 0, 0, 0, 200);
  13:          _doubleClickTimer.Tick += DoubleClickTimerTick;
  14:      }
  15:   
  16:      private void DoubleClickTimerTick(object sender, EventArgs e)
  17:      {
  18:        _doubleClickTimer.Stop();
  19:      }
  20:   
  21:      private void BnTest_Click(object sender, RoutedEventArgs e)
  22:      {
  23:        if(_doubleClickTimer.IsEnabled)
  24:        {
  25:          MessageBox.Show("Doppelklick ausgeführt!");
  26:        }
  27:        else
  28:        {
  29:          _doubleClickTimer.Start();
  30:        }
  31:      }
  32:    }
  33:  }

 

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

 

Viel Spaß!

Euer Gregor

Reactive Extensions (Rx)–Asynchrone Prozesse

22.07.2011 12:27:01 | Gregor Biswanger

Rx_Logo_small

Um einen Prozess asynchron auszuführen, werden diese in Threads gepackt. Ab dem .NET-Framework 4.0 kann man sogar seine Prozesse mittels Tasks-Klasse auf mehrere CPU-Kerne parallelisieren. Was allerdings nur bei wirklich komplexen und lang andauernden Prozessen sinnvoll ist. Dazu aber mehr bei einem eigenen Blog-Post.

Ein großes Problem bei Threads ist die gegenseitige Abhängigkeit der Prozesse. Zum Beispiel startet Prozess 1 den Prozess 2 in einem eigenen Thread. So kann Prozess 2 eigenständig vom System verarbeitet werden, während Prozess 1 sich auch erst um seine Details kümmert. Doch gegen Ende von Prozess 1 werden die Ergebnisse aus Prozess 2 benötigt. Jedoch braucht Prozess 2 noch um einiges länger. Das Problem hierbei ist, das Prozess 1 aber trotzdem weiterverarbeitet wird, ohne direkt auf den Prozess 2-Thread zu warten. Das wäre eine solche Abhängigkeit, wie zu Beginn erläutert.

Das folgende Beispiel zeigt, wie ein falsches Ergebnis angezeigt wird, weil die zu erwartenden Daten noch nicht von Prozess 2 geliefert wurden. Der braucht nämlich noch 2 Sekunden länger.

 

   1:  internal class Program
   2:  {
   3:      public static int ResultValue;
   4:   
   5:      private static void Main(string[] args)
   6:      {
   7:          Console.WriteLine("Prozess 1 läuft... in Thread {0}", Thread.CurrentThread.ManagedThreadId);
   8:   
   9:          Thread prozess2Thread = new Thread(Calculate);
  10:          prozess2Thread.Start();
  11:   
  12:          Console.WriteLine(ResultValue + 5);
  13:   
  14:          Console.WriteLine("End...");
  15:          Console.ReadLine();
  16:      }
  17:   
  18:      private static void Calculate()
  19:      {
  20:          Console.WriteLine("Calculating... in Thread {0}", Thread.CurrentThread.ManagedThreadId);
  21:          Thread.Sleep(TimeSpan.FromSeconds(2));
  22:          ResultValue = 5;
  23:      }
  24:  }

 

Ich bin auf jeden Fall schon auf Eure Lösungen gespannt, die Ihr mir gerne per E-Mail zukommen lassen könnt. Die besten Lösungen werden mit einem eigenen Blog-Post dann veröffentlicht.

 

Viel Spaß!

Euer Gregor

Gewinnspiel zur See# Party 2011

22.07.2011 06:00:00 | Jürgen Gutsch

 

Die Location für die See# Party ist nicht nur großartig, sondern auch groß und es sind noch reichlich freie Plätze vorhanden.

Daher möchten wir euch mit einem kleinen Gewinnspiel zusätzlich anspornen, um an der See# Party 2011 teilzunehmen.

In der Woche vom 1. bis zum 7. August verlosen wir unter allen Anmeldungen zur See# Party zwei Kostenlose Teilnahmen an der Konferenz. Zusätzlich erhalten alle Anmeldungen in diesem Zeitraum (am Eingang) ein See# Party T-Shirt überreicht.

Blogparade

Wer über die See# Party und das Gewinnspiel in seinem Blog berichten möchte ist herzlich dazu eingeladen. Alle fleißigen Blogger erhalten von uns ebenfalls (am Eingang der See# Party, bzw. nach der Veranstaltung per Post) ein T-Shirt überreicht. Wichtig ist eine Verlinkung auf das Gewinnspiel auf der Website (www.seesharpparty.de/gewinnspiel) und auf diesem Beitrag in meinem Blog.

Twitterparade

Wer ungern viel schreibt darf auch per Twitter auf das Gewinnspiel aufmerksam machen. Dazu einfach folgenden Text per Twitter veröffentlichen.

Gewinnspiel zur See# Party 2011: zwei mal freier Eintritt zu gewinnen und dabei T-Shirts abstauben: http://bit.ly/qZLpRB #ssp2011 #parade

Da twittern nicht so aufwendig ist wie das schreiben eine Blogeintrages, können fleißige Twitterer ausschließlich bei Anmeldung zur Konferenz ein T-Shirt abstauben.

Die Verlosung

Die Verlosung der Tickets findet am 8. August statt. Zur Verlosung selber setzte ich ein kleines Tool ein, das Peter Bucher mal für den .NET-Stammtisch geschrieben hat.

Die Namen der Gewinner werden hier auf dem Blog veröffentlicht.

Folgender Code zieht per Zufall einen Namen aus einer Textdatei. Das Tool werde ich zweimal starten, wobei ich vor dem zweiten Mal den ersten Gewinner aus der Datei entfernen werde.

Hier der komplette Code:

class Program
{
    private const string Restart = "Verlosung neu starten? [Y für Ja eingeben]: ";
    private const string TheWinnerIs = "Der Gewinner ist: ";
    private const string SearchingTeeWinner = "Gewinner wird ermittelt: {0}";
    private const string Icons = "\\|/-";
    static void Main(string[] args)
    {
        if (!File.Exists(args[0]))
        {
            return;
        }
        List<string> opponents = new List<string>();
        string[] names = File.ReadAllLines(args[0]);
        opponents.AddRange(names);
        SearchWinner(opponents);
    }
    private static void SearchWinner(IList<string> opponents)
    {
        int index = CreateRandomIndex(opponents);
        PrintFakeProcess();
        PrintResult(opponents, index);
        RequestForRestart(opponents);
    }
    private static int CreateRandomIndex(ICollection<string> opponents)
    {
        Random random = new Random();
        return random.Next(0, opponents.Count);
    }
    private static void PrintFakeProcess()
    {
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                Console.WriteLine(String.Format(SearchingTeeWinner, Icons[j]));
                Thread.Sleep(500);
                Console.Clear();
            }
        }
    }
    private static void PrintResult(IList<string> opponents, int index)
    {
        Console.WriteLine(String.Format(SearchingTeeWinner, "done"));
        Console.Write(TheWinnerIs);
        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write(opponents[index]);
        Console.ResetColor();
        Console.WriteLine("!");
    }
    private static void RequestForRestart(IList<string> opponents)
    {
        Console.WriteLine();
        Console.Write(Restart);
        var key = Console.ReadKey(false);
        if (key.KeyChar == 'Y' || key.KeyChar == 'y')
        {
            SearchWinner(opponents);
        }
    }
}

Erklärungen und Kleingedrucktes

  1. Teilnahmeberechtigt an der Verlosung und der Blog- und Twitter-Parade ist jeder, ausgenommen die Veranstalter der See# Party und deren Angehörige.
  2. Jeder Teilnehmer darf nur einmal teilnehmen.
  3. Alle Gewinner der Tickets werden per E-Mail benachrichtigt.
  4. Die Zustellung der T-Shirts erfolgt persönlich am Empfang der See# Party
  5. Die Gewinner erklären sich mit einer Veröffentlichung Ihrer Vornamen und des Anfangsbuchstabens des Nachnamens in diesem Blog einverstanden.
  6. Die Ausbezahlung der Preise in bar ist nicht möglich.
  7. Der Rechtsweg ist ausgeschlossen.
  8. Gewährleistungsansprüche hinsichtlich der Gewinne sind ausgeschlossen.

Ich wünsche allen Teilnehmern viel Spass und viel Glück, auf das man sich auf der See# Party trifft. :-)

DotNetKicks-DE Image

jQuery auf Koffein

19.07.2011 20:35:00 | Jan Christian Selke

Der Name CoffeeScript geistert schon eine Weile umher. Viele haben bereits in Verbindung mit Node.js damit gearbeitet. Da ich in letzter Zeit weder selbige noch große Lust hatte mir ein Ubuntu oder eine andere Linux Distribution meines Vertrauens zu installieren, habe ich es einfach vorerst ignoriert… Jetzt habe ich vor kurzem Mindscapes Web Workbench entdeckt.

Die Web Workbench ist eine Visual Studio 2010 Erweiterung zur Integration von LESS, SASS und Coffee Script. Und gerade das letzte, ohne die Notwendigkeit Node.js installieren zu müssen. Jetzt doch etwas neugierig habe ich es von Microsoft heruntergeladen, installiert und losgelegt.

Zum ersten Herumspielen musste einfach eine ASP.NET MVC Anwendung herhalten. Die Anwendung blieb soweit unverändert und gleich erstmal eine CoffeeScript Datei hinzufügen. Wie man in der folgenden Abbildung sehen kann, werden nun drei neue Dateitypen angeboten: sass SCSS Style Sheet, Less Style Sheet und CoffeeScript File.

CoffeeScript

Also letzteres hinzugefügt und es erscheinen in dem Projekt zwei neue Dateien. Eine Datei mit der Endung .coffee und eine mit der Endung .js. Die .coffee Datei ist natürlich die Datei, die das Coffee Script enthalten wird. Die .js Datei enthält den automatisch aus dem Coffee Script erzeugten Javascript Code.

CoffeeScriptFiles

Als einfaches, kurzes Beispiel wollte ich einfach eine Slideshow mit jQuery erstellen und laufen lassen. Meine Index.cshtml habe ich dazu um die für die Slideshow notwendigen Basis-Divs erweitert. Da ich erst einmal nur ein Gefühl dafür bekommen wollte, wurde ein div zu drei…

   1:  <div id="slideShow"> 
   2:      <div> 
   3:          <img src="@Url.Content("~/public/images/SlideShowPicture.png")" width="200" 
   4:              height="200" alt="Ein Park" /> 
   5:          <p> 
   6:              Hier ist ein schönes Sommerbild</p> 
   7:          <p> 
   8:              Dieser Park war ein schöner Spielplatz für alle Kinder. 
   9:          </p> 
  10:      </div> 
  11:      <div> 
  12:          <img src="@Url.Content("~/public/images/SlideShowPicture.png")" width="200" 
  13:              height="200" alt="Ein Park" /> 
  14:          <p> 
  15:              Hier ist ein schönes Sommerbild</p> 
  16:          <p> 
  17:              Dieser Park war ein schöner Spielplatz für alle Kinder. 
  18:          </p> 
  19:      </div> 
  20:      <div> 
  21:          <img src="@Url.Content("~/public/images/SlideShowPicture.png")" width="200" 
  22:              height="200" alt="Ein Park" /> 
  23:          <p> 
  24:              Hier ist ein schönes Sommerbild</p> 
  25:          <p> 
  26:              Dieser Park war ein schöner Spielplatz für alle Kinder. 
  27:          </p> 
  28:      </div> 
  29:  </div> 

Nun noch schnell die Javascript Datei in die Webseite eingebunden und schnell F5 gedrückt. Nach einem kurzen Augenblick zeigte sich dann die Standard Webseite – aber um eine von links nach rechts durchschiebende Slideshow reicher…

FertigeSlideShow

Was kann man zu so einem Beispiel schon groß sagen? Es funktioniert einwandfrei und erfüllt in diesem Einfachstbeispiel seinen Zweck. Inwiefern komplexere Anwendungen damit entwickelt werden können, wird sich noch zeigen.

Es ist aber definitiv eine interessante Alternative… und ich kann endlich mit Coffee Script arbeiten. Mit Kaffee arbeitet es sich einfach besser Zwinkerndes Smiley.

Community, Consumity, Überangebot und Mainstream

18.07.2011 03:42:03 | Jürgen Gutsch

Am Wochenende beim .NET Open Space Süd, schlug ich das Thema Community vor, aber mit dem Sinn, zwei Vorschläge für die Community einzubringen um diese für weitere Personen interessant zu machen.

Der erste Vorschlag betraf eine Regionale Vernetzung von Usergroups und der zweite Vorschlag betraf den Community MVP, den ich hier bereits borgeschlagen hatte.

Mein erster Vorschlag wurde ergänzt von Kostjas Präsentation des Communty Blendrs, das eine stärkere Vernetzung der gesamten Entwickler-Community anstrebt.

Da mein Themenvorschlag mit Ilkers Vorschlag zusammengelegt wurde, bestand der zweite Teil aus einer Diskussion über seine aktuelle Sicht auf die Community und seine Veranstaltungen.

Dabei wurden Consumity, Überangebot und Mainstream angesprochen, aber auch die Tatsache, dass einige Beteiligte in der Community Marketing in eigener Sache machen würden.

Community ist IMO mehr als nur zusammensitzen, diskutieren und lernen. Community ist ein geben und nehmen. Wer viel gibt, bekommt auch was zurück. Meine eigene Community-Arbeit begann im ASP-Forum und wurde auf ASP.NET Zone weitergeführt. Später kam meine eigene Usergroup dazu und jetzt die See# Party. Community-Arbeit hat positive Nebeneffekte die sich nicht vermeiden lassen:

  • Starke Vernetzung in der gesamten Community
  • Bekanntheit
  • Aufmerksamkeit

Diese Effekte führen dazu, das man diese auch (aus-)nutzt. Ob das nun positiv oder negativ ist, ist Sache des Betrachtungswinkels. IMO ist das in den meisten Fällen positiv. Das man diese Effekte ausnutzt, um Marketing in eigener Sache zu machen, ist nicht nur natürlich sondern auch völlig richtig. Auf das richtige Maß kommt es an. Das an diesem Wochenende das falsche Maß gewählt wurde konnte ich definitiv nicht feststellen. Das Open-Spaceler haben mehrfach Themen gewählt, in der die Teilnehmer nur Konsumenten waren. Das ist völlig OK, das ist legitim und richtig. Schließlich sind die Themen gemeinsam angenommen worden. Wenn ein Thema der Community dient oder dienen kann, ist es IMO nicht falsch das auch zu präsentieren.

Natürlich gibt es auch hier schwarze Schafe, welche die Community als günstige Werbeplattform missbrauchen. Aber die kann ich an einer Hand abzählen und die waren am Wochenende definitiv nicht anwesend ;-)

Und letztenendes siegt immer die natürliche Auslese.

Consumity ist ein Thema das immer wieder angesprochen wird, wenn sich Usergroup-Leader treffen. Aber ist das wirklich ein Problem? Ich denke nicht. Ganz im Gegenteil ist es sogar erfreulich und lobenswert, das sich Entwickler aufrappeln in eine Usergroup gehen und sich freiwillig fortbilden. Es gibt immer noch viel zu viele Entwickler, die mit Scheuklappen durch die Gegend rennen und nach 5 Uhr nichts mehr tun.

“Gut ding braucht Weil” Beim .NET-Stammtisch dauerte es allerdings nicht lang, bis der erste Vortrag eingereicht wurde, der nicht von einem Speaker oder Leader gehalten wurde. Wer etwas gibt, bekommt auch was zurück. So geben auch Consumity-Member (was für ein hässlicher Begriff) etwas zurück und wenn das nur die Aufmerksamkeit ist.

Ein Überangebot an Community-Aktivitäten gibt es – wie Ilker gestern angemerkt hat – IMO wirklich nur aufgrund der starken Vernetzung, nur für Community-Macher. Community-Macher und Community-Aktivisten sind diejenigen die es immer schwerer haben auf jede der vielen Veranstaltung zu gehen die oftmals gleich sind. Die starke Vernetzung ignoriert die räumliche Entfernung und möglicherweise auch die Zielgruppe.

Ich bin überzeugt, dass hier der Communty Blendr auch wieder ein stückweit helfen wird a) die Community-Events besser zu verteilen und b) wieder einen richtigen Überblick zu verschaffen.

Ich bin auch überzeugt, das Consumity-Member (der Begriff wird nicht schöner, je öfter man ihn verwendet) das Überangebot nicht oder nicht so stark sehen.

Natürlich wird es einem Community-Aktivisten irgendwann zu viel, wenn dann ein Jürgen Gutsch immer wieder Werbung für die See# Party macht und selbst auf einem anderen Event mit für die See# Party aktiv wird. Das ist Community-Aktivismus, das ist Werbung für eine Community-Sache und (wenn mach ein paar Absätze nach oben schaut) natürlich auch Werbung in eigener Sache. Logisch.

Wie oben gesagt, kommt es auf das Maß an. Allerdings auch auf das Maß der Wahrnehmung.

Die Mainstream-Themen sind ebenfalls gerechtfertigt, zumindest wenn man sich die Zielgruppe einer Veranstaltung vor Augen führt. Wem soll die Veranstaltung dienen? .NET-Entwicklern? Natürlich und diese beschäftigen sich mehrheitlich mit Mainstream-Themen und haben Mainstream-Probleme. Natürlich kommen dadurch solche Themen auf den Tisch. das ist IMO nicht falsch. Kommt der Consumity-Member (jetzt reicht’s dann) auf die Idee Ruby anzuschauen oder Rake zu verwenden? Warum sollte er? Das wir er erst tun, wen er merkt, dass das Herkömmliche nicht mehr ausreicht. So sind Mainstream-Themen für die meisten Community-Aktivisten nicht mehr neu, nicht mehr interessant.

Eine völlig andere und offene Frage ist, was Mainstream in diesem Fall überhaupt ist. Wo fängt es an, wo hört es auf? Ist Mainstream alles das was von Microsoft kommt? Wohl kaum, oder?

Das ist mal kurz die Sichtweise von mir. Nicht mehr und nicht weniger.

DotNetKicks-DE Image

.NET Open Space Süd in Karlsruhe

18.07.2011 02:36:00 | Jürgen Gutsch

Am Wochenende (16. und 17. Juli) fand das dritte (für mich das zweite) .NET Open Space Süd statt. Es war wieder mal absolute klasse. Vielfältige Themen, tolle Leute und eine interessante Location. Nette Tanten und Onkels versorgten und mit Essen, Trinken und vor allem Kaffee.

Eine ganz besondere Überraschung war die Idee, die Session Planung mit eine Kinekt-gesteuerten WPF-Awendung zu machen und jedem per Web die Möglichkeit zu bieten, die Sessions mobil einzusehen oder auch darüber Vorschläge machen zu lassen.

Hiermit möchte ich mich ganz herzlich bei den Organisatoren Frank, Alex, Ralf und Aydin bedanken. Ich freue mich jetzt schon auf das nächste mal. :-)

Ich selber konnte zwei Themen beitragen, die – wie erwartet – anders liefen als ich mir das ursprünglich ausgedacht habe. Aber so muss es ja sein. :-)

Ganz interessant war der Effekt, den das erste Thema auf das zweite hatte:

Im ersten Thema stellte ich zwei Vorschläge vor. Zum einen eine übergeordnete Regionale Plattform für Usergroups und zum anderen den Community MVP, den ich in diesem Blog bereits vorgestellt hatte. Der zweite Vorschlag ging etwas unter als Kostia die Plattform Community Blender vorstellte, die genau meinem ersten Vorschlag entsprach, bis auf die Tatsache, dass Community Blender eine Plattform für die gesamte Community sein soll. Im zweiten Teil der ersten Session wurden von Ilker Probleme angesprochen und Diskutiert die er neuerdings in der .NET-Community und Community-Veranstaltungen sieht. (Darauf gehe ich in einem weiteren Blogeintrag ein.)

Und genau diese Diskussion war es die mich dazu bewogen hat in meiner zweiten Session für mich und Gregor etwas die Bremse zu ziehen und uns zurückzuhalten, und jeden Teilnehmer mal über seine Erfahrungen und Einwände sprechen zu lassen.

DotNetKicks-DE Image

Das 1x1 des Microsoft SQL Server 2008 R2 für Softwarehersteller

15.07.2011 14:19:42 | Peter Kirchner

Heute möchte ich Sie über eine etwas andere Webcast-Reihe informieren, die wir (Sascha Lorenz und ich) aufgenommen haben, um Ihnen einige Praxiserfahrung zum SQL Server 2008 mitzugeben.

Ich hoffe, Sie können daraus einiges lernen. Wenn Sie Feedback haben oder sich in Zukunft ähnliche Formate wünschen, so lassen Sie es mich bitte wissen! Für Vorschläge habe ich immer ein offenes Ohr. :-)

In dieser Webcast-Reihe zum SQL Server 2008 R2 präsentieren wir Ihnen einige Themen, die in der Vergangenheit zu Unsicherheiten oder Missverständnissen geführt haben und wegen denen der SQL Server zum Teil nicht optimal eingesetzt wurde. Was Sie erwartet, ist daher keine bloße Aneinanderreihung von Features des SQL Server 2008 R2. Wir sprechen vielmehr über die Erfahrungen, die wir bei Softwareherstellern gesammelt haben und die sie hier in Form einiger ganz typischer Erkenntnisse weitergeben - interessant gerade für solche Softwarehersteller, die den SQL Server als Datenbank einsetzen. Sehen Sie diese Webcast-Reihe als eine Art Erfahrungsbericht, um typische Fehler zu vermeiden und als Möglichkeit, künftig bisher eher unbekannte Merkmale vom SQL Server zu nutzen, um Ihre Softwarelösungen in den Bereichen Fehlerfreiheit, Performance und Feature-Angebot für Ihre Kunden zu optimieren.

Folgende fünf Teile haben wir zusammengestellt:

  • Teil 1: Einführung & Übersicht
  • Teil 2: Performance Optimierung
  • Teil 3: Debugging & Security
  • Teil 4: Ready up! Was gibt’s Neues ab SQL Server 2008
  • Teil 5: Nach der Auslieferung

Die Webcast-Reihe ist hier zu finden: Das 1x1 des Microsoft SQL Server 2008 R2 für Softwarehersteller

Webcast Serie: Einführung in die Workflow Foundation 4 - Workflows persistieren

14.07.2011 11:15:21 | Gregor Biswanger

silverlight-webcast

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

 

Workflows persistieren

Ein essentieller Schwerpunkt bei der Abarbeitung von Geschäftsprozessen ist die Ermittlung des Zustands der jeweiligen Situation. Wichtig ist dabei, diese Zustände auch zu behalten, falls sich die Ausführung der nächsten Prozesse auf unbestimmter Zeit verschieben sollte. Der Webcast vermittelt die Grundlagen zur Abspeicherung von Prozessen durch das Persistieren von Workflows.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487437

July Update : Visual Studio ALM Pivot

14.07.2011 10:23:22 | Christian Binder

Folgende Neue Inhalte sind nun auch im Visual Studio ALM Pivot verfügbar:

Application Lifecycle Management Einführung
Visual Studio ALM - Eine Einführung in 25min

Visual Studio vNext
Visual Studio vNext Application Lifecycle Management - Eine Preview

Test
Exploratives Testing mit dem Test Manager 2010
Visual Studio Lab Management Guide

Build
Visual Studio Build Customization Guide

Development
Visual Studio 2010 und C++ - Performante Anwendungen mit C++

Viel Spass

Visual Studio vNext : Feedback geben und Feature Requests voten

13.07.2011 10:17:07 | Christian Binder

Auf Visual Studio User Voice Seite kann man Feedback geben und bestehende Feature Requests für folgende Produkte voten:

– Visual Studio Ultimate
– Test & Lab Management
– Team Foundation Server

Diese Seite bitte nur für Feedback nutzen und nicht zum Bug Reporting. Bugs können online unter http://connect.microsoft.com/visualstudio erstellt werden. Die Seite wird bis zum Release der Visual Studio vNext verfügbar sein.

Danke für die Unterstützung!!!
Chris

Office Development Site Map

12.07.2011 02:05:00 | Lars Keller

Eine gute Übersicht für die MS Office Entwicklung bietet die Office Development Site Map. Für sämtliche MS Office Anwendungen, findet man dort How-Tos und Tipps & Tricks.

Grafisches Front-End für SignTool.exe

11.07.2011 08:08:00 | Lars Keller

Ich bin gerade über das Tool SignGui gestolpert. Dennis Wallentin hat eine GUI erstellt mit der die  SignTool.exe eine grafisches Front-End bekommt.

Wer VSTO deployed wird dieses Tool sehr nützlich finden!

Tool: SignGui

Zur Sache: HTML5 - Was ist das? Warum nutzen? Webtechnologie von morgen?

06.07.2011 08:49:30 | Kay Giza

Im Web liest man derzeit in einschlägigen Fach- und Presse-Seiten und natürlich auf und in vielen Social-Media-Webseiten sowie Blogs sehr viel über HTML5. Während unserer derzeit noch laufenden "MSDN on Tour - Sommer Edition" referieren wir jeden Tag derzeit über HTML5 mit enorm hohem Interesse: HTML5, Internet Explorer 9 und 10 - ein 360° Überblick für Web-Entwickler. Alleine gestern in Nürnberg gab es dazu sogar glatt zwei Vorträge die beide mehr als voll besucht waren. Nun, viele fragen sich derzeit - und dies zu Recht - was ist dieses HTML5? Wo kommt der Hype her und warum interessieren sich so viele Menschen dafür? Woher kommen die viele Besucher der Vorträge rund um HTML5, was treibt diese Web-Entwickler an sich Fachliteratur oder Lernvideos rund um dieses Thema anzuschauen? Auch Microsoft selber ist gegenwärtig mit mehr als 60 Mitarbeitern in rund 40 technischen Gruppen - ein starker Unterstützer des W3C. Dessen in letzter Zeit wohl öffentlichkeitswirksamstes Projekt ist HTML5... Eine der besten und informativsten Erklärungen rund um HTML5 habe ich persönlich in... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Asynchrone Controller in MVC3

05.07.2011 09:16:00 | Martin Hey

Die Zeiten in denen Anwender bereit waren, lange Wartezeiten in Kauf zu nehmen sind vorbei. Hat man eine Seite, die schwer zu beschaffende Informationen beinhaltet, so ist der Standardweg, dem Anwender zunächst schon einmal eine Seite auszuliefern, die dann mit Hilfe von asynchronen Requests (AJAX) die restlichen Seitenkomponenten nachlädt und im DOM ersetzt. Mit den aktuellen Frameworks und Bibliotheken ist das alles recht unproblematisch und schnell implementiert. Und so ist man auch in den meisten Fällen mit der Kombination aus synchronen Controller-Actions, Partial Views und AJAX recht gut bedient.

In bestimmten Fällen kann es aber auch sinnvoll sein, serverseitig asynchrone Prozesse zu verwenden. Auch wenn alles recht einfach implementiert ist (wie ich gleich zeigen werde), so ist im Vorab die Sinnhaftigkeit zu hinterfragen. Die Umstellung auf asynchrone Aktionen bringt nur dann etwas, wenn beispielsweise unabhängig voneinander mehrere Backend-Services abgefragt werden und die Backend-Systeme auch in der Lage sind, diese Anfragen parallel zu beantworten. In diesem Fall würde im Vergleich zur sequentiellen Abarbeitung in der sich die Ausführungszeit aus der Summe der Subrequests zusammensetzt die parallele Abarbeitung nur etwas länger als der längste Request dauern.

Das Vorgehen ist nicht kompliziert: Zunächst ändert man die Basisklasse des Controllers. Statt von Controller zu erben, verwendet man nun AsyncController.

public class HomeController : AsyncController
{
     // todo: add some views
}

Auch mit dieser Basisklasse sind nach wie vor synchrone Anfragen möglich - es wird ledigleich zusätzlich die Möglichkeit gegeben, serverseitig asynchrone zu arbeiten.

Der nächste Schritt betrifft die Action. Synchrone Controller-Actions bestehen aus einer Methode, die normalerweise den Namen der View haben und als Rückgabeparameter ein ActionResult haben. Das folgende Beispiel würde die View Index ausliefern.

public ActionResult Index()
{
    // do something
    return View();
}

Im Fall der asynchronen Controller-Action muss diese Methode gesplittet werden: Die erste Methode (im Beispiel IndexAsync) nimmt den Request entgegen und startet die asynchronen Hintergrundprozesse. Diese Methode hat keinen Rückgabewert. Dieser ist erst in der zweiten Methode vorhanden (im Beispiel IndexCompleted). Hier erfolgt die Verarbeitung der Rückgabewerte der Hintergrund-Requests und die Auslieferung der View. Wie häufig im ASP.NET MVC, so ist die konventionsgemäße Benennung der Methoden wichtig, damit die Magie funktioniert.

Wichtig ist, dass man nicht vergessen darf, dass man die Abarbeitung in den Thread-Pool übergibt und es dort ggf. einige Kontext-Objekte nicht mehr gibt und dass man die Kontrolle in einem statischen Kontext zurück bekommt. Zur Unterstützung der Abarbeitung steht im AsyncController ein AsyncManager zur Verfügung. Mit dessen Eigenschaft OutstandingOperations definiert man, wie viele offene Hintergrundprozesse es gibt. Wann immer ein Subrequest ein Ergebnis zurückliefert, schreibt man das Ergebnis in die Parameters-Auflistung des AsyncManagers zurück und verringert die OutstandingOperations.

Mein komplettes Beispiel sieht nun wie folgt aus:

public class HomeController : AsyncController
{

    public void IndexAsync()
    {
        AsyncManager.OutstandingOperations.Increment();
        var webRequest = WebRequest.Create(
                "http://api.twitter.com/1/statuses/user_timeline.xml"
                + "?screen_name=martin_hey");


        Observable
        .FromAsyncPattern<WebResponse>(webRequest.BeginGetResponse, 
            webRequest.EndGetResponse)()
        .Subscribe(response =>
                        {
                            var streamReader = new StreamReader(
                                response.GetResponseStream());
                            var responseText = streamReader.ReadToEnd();
                            AsyncManager.Parameters["TweetXml"] = responseText;
                            AsyncManager.OutstandingOperations.Decrement();
                        });
    }



    public ActionResult IndexCompleted(string tweetXml)
    {
        var model = new TweetViewModel
                        {
                            TimelineXml = tweetXml
                        };
        return View(model);
    }

}

In IndexAsync erfolgt ein Webrequest auf ein Drittsystem - im echten Leben wären hier mehrere Requests. Im der Callback-Action dieses Requests schreibe ich das erhaltene Ergebnis in die Parameter des AsyncManagers. Man könnte hier auch komplette Objekte oder Objektstrukturen ablegen, ich beschränke mich aber der Einfachheit halber auf den XML-String. Ist OutstandingOperations wieder auf 0, so wird IndexCompleted automatisch aufgerufen und die Parameter im AsyncManager auf die Parameter der Methode gemappt. Hier erfolgt dann die restliche Verarbeitung - in der Regel der Aufbau des Models zur Darstellung der View und die Rückgabe der View.

Einen kleinen Nachteil hat diese Umstellung noch: Kann man in der synchronen Verarbeitung problemlos mit Hilfe von Profiler-Werkzeugen (z.B. MVC Mini Profiler) eingreifen und beispielsweise die Laufzeit der Subrequests anzeigen, so wird das im asynchronen Kontext schon komplizierter bis unmöglich.

Englische Version Englische Version

Zweite Auszeichnung zum Microsoft MVP!

04.07.2011 12:56:34 | Gregor Biswanger

MVPLogo


Am Freitag (1.Juli 2011) hatte ich eine E-Mail erhalten, die mir das Wochenende versüßte:

Sehr geehrte(r) Gregor Biswanger,

herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2011 verleihen zu können! Diese Auszeichnung wird an herausragende, führende Mitglieder der technischen Communities verliehen, die ihre wertvollen praktischen Erfahrungen mit anderen Menschen teilen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema Client App Dev im vergangenen Jahr hoch ein.
...


Somit erhielt ich für ein weiteres Jahr eine MVP Auszeichnung zum Thema Client Application Development. Ich bin sehr stolz darauf und bedanke mich bei der ganzen Community, die sich für meine Vorträge, Artikel und Videos interessieren und mich durch Ihr Interesse immer mehr gepusht haben…

Natürlich auch ein großes Dankeschön an Microsoft, die meine Aktionen kräftig unterstützt haben.

Mit geballter Community Power wird es weiter gehen und ich stehe zum folgenden Motto:

Wie oft hört man "Man kann ja nicht allen Menschen auf der Welt helfen!" Na und? Helfen wir einem, und wenn wir dem geholfen haben, dann helfen wir dem nächsten...
© Wolfgang J. Reus, (1959 - 2006), deutscher Journalist, Satiriker, Aphoristiker und Lyriker


Gerne stehe ich für User Groups jeder Zeit kostenfrei für weitere Vorträge bereit. Dazu bitte einfach per E-Mail Kontakt mit mir aufnehmen.

 

image

 

Vielen lieben Dank nochmal an alle, gemeinsam werden wir noch einiges zu Wege bringen!

Alles neu macht der Mai

04.07.2011 11:46:00 | Jan Christian Selke

Es ist zwar nicht mehr Mai, aber die Schatten ziehen sich noch immer etwas.

Nachdem ich Ende Mai meinen Arbeitgeber gewechselt habe, hat sich auch meine berufliche Fokussierung etwas gewandelt. Damit einhergehend wird sich in Zukunft mein Schwerpunkt immer weiter weg von VSTO und OpenXml Themen verschieben.

Ich freue mich auch darauf, denn etwas von dem, was ich gelernt habe ist: Automatisierte Dokumentgenerierung mit einfachen, überschaubaren Dokumenten ist durchaus möglich – Aber komplexe Dokumentstrukturen auf Basis des Office OpenXml kann einen in den Wahnsinn treiben. Es ist schon schwer genug die Dokumentstruktur beherrschen zu wollen, aber die zum Teil sehr eigenen Verhaltensweisen von Word können für psychotische Schübe sorgen... Ich sage nur Fußnoten, Tabellen und/oder Abschnittswechsel (auch in Verbindung mit unsichtbarem Text).

Ich bin auf jeden Fall gespannt, was die nähere Zukunft mit sich bringt…

Über 1 Jahr Silverlight Expertise und 32 gratis Silverlight How-To´s

04.07.2011 11:30:30 | Gregor Biswanger

 

dotnet-magazin-logoSNAGHTMLe5f110b

 

Die Zeit vergeht wie im Flug und die Silverlight-Kolumne: Silverlight Expertise, ist nun schon über 1 Jahr alt. In der Zwischenzeit hat das dot.NET Magazin einige Artikel kostenfrei auf dotnet.de veröffentlicht. Diese möchte ich euch natürlich nicht vorenthalten und wünsche viel Spaß damit!

dot.NET Magazin Ausgabe 06/2011 - "Mirror Reflections von Images",
"Design-Time-freundliches ViewModel" und "Windows Phone 7 - Testen von WP7-Apps"

dot.NET Magazin Ausgabe 05/2011 - "Zugriff auf XML-Dateien",
"Logging unter Silverlight" und "Windows Phone 7 - Emmulator erkennen"

dot.NET Magazin Ausgabe 04/2011 - „E-Mail versenden“, „Reactive Coding
und “Windows Phone 7 - Emulator mit Tastatur bedienen

dot.NET Magazin Ausgabe 03/2011 - „Silverlight hat einen Timer“,
Default Button setzen“ und “Windows Phone 7 - Versteckte Emulator-Features

dot.NET Magazin Ausgabe 02/2011 - „Die AutoCompleteBox“,
Das Filtern von Daten“ und “Windows Phone 7 - Individueller Splashscreen

dot.NET Magazin Ausgabe 01/2011 - „Daten bei Datenbindung formatieren“,
XAP-Datei vor Hijacking schützen“ und “Windows Phone 7 - Page Navigation


dot.NET Magazin Ausgabe 12/2010 - „Datenfehler unter Expression Blend vermeiden“ und
Silverlight Unit Tests unter Continuous Integration Systeme

dot.NET Magazin Ausgabe 11/2010 - „Umlaute und Sonderzeichen in XAML
und „TextBox mit Wasserzeichen

dot.NET Magazin Ausgabe 09/2010 - „Text Trimming“ und „Bing Maps für Silverlight

dot.NET Magazin Ausgabe 07/2010 - „Statische Resourcen aus Assemblies
und „Popup-Hinweis zur unterstützen Bildschirmauflösung

dot.NET Magazin Ausgabe 06/2010 - „TextBlock-Texte selektierbar machen
und „Parameter an Silverlight übergeben


dot.NET Magazin Ausgabe 05/2010 - „Doppelklick implementieren
und „Der eigene Assembly Preloader


dot.NET Magazin Ausgabe 04/2010 - „Silverlight Install Experience ans eigene Design anpassen
und
WebBrowser-Steuerelement ab Silverlight 2 selbst schreiben

Webcast Serie: Einführung in die Workflow Foundation 4 – Bookmarks und Workflow Extensions

04.07.2011 10:14:43 | Gregor Biswanger

silverlight-webcast

Ab heute gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

Bookmarks und Workflow Extensions

Eine große Stärke der Workflow Foundation 4.0 ist die flexible Handhabung komplexer Geschäftslogik. Dazu gehört etwa, dass unterschiedliche Prozesse eine unbestimmte Zeit andauern können. Dank der Bookmark-Funktionalität können Workflows auch an beliebiger Stelle fortgesetzt werden. Sollte jedoch ein Workflow interaktiv Informationen während der Abarbeitung außerhalb des Workflow-Hosters weitergeben können, hilft die Funktionalität der Workflow Extensions. Dieser Webcast durchleuchtet beide Bereiche im Detail.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487432

Webcast Serie: Einführung in die Workflow Foundation 4–Hosting und Activities

04.07.2011 10:03:39 | Gregor Biswanger

silverlight-webcast

Seit letzter Woche gibt es einen weiteren Teil zu meiner Webcast-Serie.

Überblick der Serie “Einführung in die Workflow Foundation 4”:

Teil 1 – Die ersten Schritte
Teil 2 – Hosting und Activities
Teil 3 – Bookmarks und Workflow Extensions
Teil 4 - Workflows persistieren
Teil 5 - WCF Workflow Services

http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1106-02.mspx

Hosting und Activities

Die Geschäftslogik kann auf dem Client oder direkt auf dem Server ausgeführt werden. Dazu müssen die Workflows entsprechend gehostet werden können. Für die jeweiligen Vorgänge kommen dann einzelne Activities zum Einsatz. Dieser Webcast geht auf beide Punkte im Detail ein und veranschaulicht die Verwendung der Workflow Foundation 4.0 unter Silverlight.

image

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032487431

Einladung zum Treffen der .NET Usergroup Dresden am 14.07.2011

03.07.2011 23:36:00 | Martin Hey

Das kommende Treffen der .NET Usergroup Dresden wird am 14.07.2011 bei Saxonia Systems stattfinden. Dabei geht es hauptsächlich um die folgenden Themen:

  1. MEF (Mario Kretschmer)
    Das Microsoft Extensibility Framework ist eine neue Bibliothek im .NET Framwork 4, die es recht leicht macht, erweiterbare Anwendungen zu schreiben. Mit Hilfe weniger Attribute kann man so die Komplexität solcher Anwendungen stark verringern und kann dynamisch Module nachladen (AddIn-Konzept).
  2. BDD mit SpecFlow (Hendrik Lösch)
    SpecFlow versucht, die Lücke zwischen Entwicklern und  Domain-Experten zu schließen. Dazu bietet es einen Editor, in dem man seine Anforderungen an die Domain recht normalsprachlich (im Gherkin-Format) in feature-Dateien herunterschreiben kann. Aus diesen werden dann Testschritte generiert, die in Unittests automatisiert getestet werden können.
Im Anschluss daran gibt es wieder Gelegenheit, gemeinsam zu netzwerken. Nähere Informationen und einen Link zur Anmeldeliste finden sich auf der Webseite der .NET Usergroup Dresden.

Regeln | Impressum