E-Mail versenden Reactive Coding WP7-Emulator mit Tastatur bedienen (Teil 2)
Kommentare

Menü 2 für Experten: Reactive Coding mit Silverlight
Microsoft DevLabs hat ein Framework veröffentlicht, mit dem asynchrone und eventbasierte Vorgänge reaktiv mittels LINQ gehandhabt werden können.

Menü 2 für Experten: Reactive Coding mit Silverlight

Microsoft DevLabs hat ein Framework veröffentlicht, mit dem asynchrone und eventbasierte Vorgänge reaktiv mittels LINQ gehandhabt werden können. Das Framework heißt Rx (Reactive Extensions) und steht kostenfrei zum Download bereit. Das Framework wird auch als Synonym LINQ to Events genannt. Somit steht für Silverlight ein mächtiges Werkzeug bereit, das gerade für verteilte und parallele Web-Service-Abfragen hilfreich ist. Im folgenden Beispiel wird von zwei unterschiedlichen Web Services eine Abfrage gestellt. Wobei die Antwort der zweiten Abfrage erst dann verarbeitet wird, wenn der erste Web Service geantwortet hat. Beide Antworten werden dann vom Framework zu einem Datenergebnis kombiniert und dem UI bereitgestellt.

Nach dem Herunterladen und Installieren des Frameworks müssen dem jeweiligen Silverlight-Projekt folgende Assemblies referenziert werden: System.CoreEx, System.Observable, & System.Reactive. Dann werden in einem ViewModel-Konstruktor die Instanzen der jeweiligen Web-Service-Proxy-Events mittels statischer Observable-Klasse und der FromEvent-Methode erfasst. Dessen Instanzen können anschließend mittels LINQ funktional mit Regeln definiert werden. Somit reagiert das Framework nur auf Zustände „reaktive“ vom System. Für das gewünschte Szenario stellt Rx die StartWith– und Merge-Methode. StartWith stellt als Erwartung, dass erst eine Antwort vom ersten Web Service FakeEvent gekommen sein muss. Mit Merge werden dann die unterschiedlichen Datenquellen zu einer kombiniert. Sollte der Zustand beider Definitionen bestätigt werden, wird die Logik innerhalb der Subscribe-Methode ausgeführt, die natürlich das Ergebnis an einer ObservableCollection sendet. Der Sourcecode dazu ist unter Listing 2.

public class ProductViewModel
{
  public ObservableCollection Products { get; set; }

  public ProductViewModel()
  {
      Products = new ObservableCollection();

      // Create Event-Instances
      var fakeEvent = Observable.FromEvent(p => ProductRepository.FakeEventMock += p, p => ProductRepository.FakeEventMock -= p);
      var productsComplete = Observable.FromEvent(p => ProductRepository.GetProductsCompleted += p, p => ProductRepository.GetProductsCompleted -= p);

      // Set behavior for Event
      var asyncEventAction = from p in fakeEvent
                             from ps in productsComplete.StartWith(p).Merge(fakeEvent)
                             select ps;

      // Set the Action
      asyncEventAction.Subscribe(param =>
                                      {
                                               Products.Clear();
param.EventArgs.NewProducts.ForEach(item => Products.Add(item));
                                           });
}

  public void LoadProducts()
  {
     ProductRepository.GetProducts();
  }
}  

Leider ist der Einstieg von Rx mit Lambda zu vergleichen. Es wirkt ungewohnt und ist je nach Szenario sehr komplex, bietet allerdings viel Flexibilität und erspart einiges an Code. Für ein How-to kann hier nicht genauer auf das Thema eingegangen werden; das hier dient eher nur als Überblick.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -