Posts mit dem Label workflow foundation werden angezeigt. Alle Posts anzeigen
Posts mit dem Label workflow foundation werden angezeigt. Alle Posts anzeigen

Mittwoch, April 22, 2009

SOA Conference 2009 Videos and Slides

Ich bin die Woche über einen anderen Blog-Eintrag auf die Live-Spaces der SOA Conference 2009 aufmerksam geworden, die Spaces sind unter http://soaconference2009.spaces.live.com angelegt. Hier gibt es sehr nette Videos und auch die PPT(X)s zu den Themen. Unter anderem gibt es Vorträge zu Dublin, Oslo und was sonst alles mit dem .NET-FX vorhanden ist, aber es gibt auch grundsätzliche Vorträge, wie an SOA-Entwicklung herangegangen werden kann.

Sonntag, Dezember 07, 2008

Technical Summit 2008 - Nachtrag

Ich bin ein ganzes Stück verspätet, hier sind aber endlich einige Details/Eindrücke vom Technical Summit.


Windows Live Spaces

Der Technical Summit war interessant und auch aufschlussreich in vielen Bereichen. Von einigen Vorträgen war ich sehr enttäuscht und andere fand ich wieder sehr Klasse. mein Fokus lag auf Parallel Computing und ASP.NET/WCF. Parallel Computing war zu allererst nicht auf der Agenda, da die Key-Note soviel Laune auf mehr gemacht hat, habe ich mir weitere Detail reingezogen. Alles zu Parallelisierung und Microsofts arbeit gibt es auf den Seiten der MSDN. Ich empfehle einfach mal die Parallel Extensions auszuprobieren, es ist sehr einfach seine Anwendung zu modifizieren.

Die Vorträge zu Azure und Cloud Computing fand ich nicht so doll. Hier ist einfach nur alles schwammig, es gibt nichts konkretes und viele Unternehmen, werde wohl nicht sensible Daten außer Haus geben wollen. Ich bin sehr gespannt, wie die Entwicklung im nächsten Jahr weiter geht.

Richtig schlecht fand ich den Vortrag zu ASP.NET-Future, hier war sicherlich auch meine Erwartungshaltung überzogen. Aber es wurde auf so vieles nicht eingegangen, an Themen vorbei geredet und unwesentliches Langgezogen und wesentliches völlig verschluckt. Schließlich wollte der Redner nur noch weg und hat einfach extrem zeitig Schluss gemacht. Der Erfahrungsgehalt des Vortrags war gleich null.

Spass gemacht haben auf jeden Fall die Vorträge von Darius Parys. Es ist sicherlich eine eigenwillige Vortragsart, aber sehr passend für Entwickler.

Technorati-Tags: ,

Dienstag, April 29, 2008

Workflow Foundation Erkenntnisse (Hosting TODOs)

Ich habe die letzten Wochen Beratung unter anderem zum Thema Windows Workflow Foundation gemacht. Dabei sollte das Workflow Designer-Control für die Anpassung der WFs genutzt werden. Im Großen und Ganzen ein super Tool und sehr interessant und mächtig, allerdings hatte die Demo, die wir benutzt haben einige ärgerliche Probleme. Eine Version mit ausführlicher Anleitung kann beim Artikel „Windows Workflow Foundation: Everything About Re-Hosting the Workflow Designer“ heruntergeladen werden.

1.       Bei der Verwendung von Umlauten, bekommt die Anwendung arge Probleme, hier müssen einige Methoden in der Loader-Klasse angepasst werden.

In der Methode PerformFlush sollte das Encoding für den Writer gesetzt werden, hier der Auszug:

   244   if (rootActivity != null )

  245  {

  246      using ( XmlWriter xmlWriter = XmlWriter . Create(

  247          this . xoml

  248          , new XmlWriterSettings () { Encoding = Encoding . UTF8, OmitXmlDeclaration = false }))

  249      {

  250          WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer ();

  251          xomlSerializer . Serialize(xmlWriter, rootActivity);

   252      }

  253  }

Außerdem habe ich noch die Methode PerformLoad angepasst, hier der Auszug:

  193   Activity rootActivity = null ;

  194   using ( StreamReader sr = new StreamReader ( this . xoml, Encoding . UTF8, true ))

  195  {

  196      using ( XmlReader reader = XmlReader . Create( this . xoml))

  197      {

  198          WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer ();

  199          try

  200          {

  201              rootActivity = xomlSerializer . Deserialize(serializationManager, reader) as Activity ;

  202          }

  203          catch ( Exception ex)

  204          {

  205              Trace . WriteLine(ex);

  206          }

  207      }

  208      if (rootActivity != null && designerHost != null )

  209      {

  210          AddObjectGraphToDesignerHost(designerHost, rootActivity);

  211          Type companionType = rootActivity . GetValue( WorkflowMarkupSerializer . XClassProperty) as Type ;

  212          if (companionType != null )

  213              SetBaseComponentClassName(companionType . FullName);

   214      }

  215  }

Bei der letzen Änderung bin ich mir nicht sicher, aber dennoch der Hinweis. Die Methode GetRootActivity in der Helper-Klasse könnte ebenfalls zu Problemen führen, auch hier eine kleine Anpassung:

   52   internal static Activity GetRootActivity( string fileName, IServiceProvider serviceProvider)

   53  {

   54      Activity rootActivity = null ;

   55      using ( StreamReader sr = new StreamReader (fileName, Encoding . UTF8, true ))

   56      {

   57          using ( XmlReader reader = XmlReader . Create(sr

   58              , new XmlReaderSettings () { XmlResolver = new System . Xml . XmlUrlResolver () }))

   59          {

   60              WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer ();

   61              DesignerSerializationManager ser = new DesignerSerializationManager (serviceProvider);

   62              ser . CreateSession();

   63              rootActivity = xomlSerializer . Deserialize(ser, reader) as Activity ;

    64          }

   65      }

   66      return rootActivity;

   67  }

2.       Die Nutzung einer Konfigurationsdatei für die möglichen Controls finde ich mehr als ungünstig, hier sollte man die AddToolboxEntries-Methode der ToolboxService-Klasse anpassen, in dem alle Assemblies (aus dem aktuellen und dessen Unterverzeichnis) durchlaufen werden und geprüft wird, ob Klassen mit der Basis-Klasse „Activity“ vorhanden sind. Außerdem nicht vergessen die Standard Activities zu laden. Das Durchlaufen der Assemblies im Ordner ist in den Code-Zeilen nicht vorhanden.

   546   Assembly assembly = typeof (System . Workflow . Activities . ActiveDirectoryRole ) . Assembly;

  547  LoopAssemblyTypes(lb, assembly);

  548  assembly = typeof ( TerminateActivity ) . Assembly;

  549  LoopAssemblyTypes(lb, assembly);

  550   //VS2008 required

  551  assembly = typeof ( SendActivity ) . Assembly;

   552  LoopAssemblyTypes(lb, assembly);

Hier die aufgerufene Methode (Außerdem wird der Assembly-Name als Titel verwendet):

   555   private void LoopAssemblyTypes( ListBox lb, Assembly assembly)

  556  {

  557      Type [] assemblyTypes = assembly . GetTypes();

  558      bool groupSet = false ;

  559      foreach ( Type assemblyType in assemblyTypes)

  560      {

  561          if (assemblyType . IsAbstract || ! assemblyType . IsClass || ! assemblyType . IsSubclassOf( typeof ( Activity )))

  562          {

  563              Debug . WriteLine( string . Format( "Class '{0}' not a valid Activity!" , assemblyType . FullName), "ToolboxService.LoopAssemblyTypes" );

  564          }

  565          else

  566          {

  567              Trace . WriteLine( string . Format( "Loading '{0}' into toolbox!" , assemblyType . FullName), "ToolboxService.LoopAssemblyTypes" );

  568              SelfHostToolboxItem item = new SelfHostToolboxItem (assemblyType, assemblyType . FullName);

  569              tbItems . Add(item);

  570              if ( ! groupSet)

  571              {

  572                  lb . Items . Add(assembly . FullName . Split( new char [] { ',' }, 2 )[ 0 ]);

  573                  groupSet = true ;

  574              }

  575              lb . Items . Add(item);

   576          }

  577      }

  578  }

3.       Übergeben der Typen an den TypeProvider dazu die Methode Initialize des Loaders erweitern. (Wird der TypeProvider nicht erweitert mit den Assemblies und dieser auch überall übergeben, so kann das der Grund sein, warum definierte Workflows nicht geladen werden. (Es gibt auch keine Fehlermeldung)

  102   foreach ( SelfHostToolboxItem toolboxItem in toolbox . Items)

   103  {

  104      typeProvider . AddAssembly(toolboxItem . Compon entClass . Assembly);

  105  }

  106  host . AddService( typeof ( ITypeProvider ), typeProvider, true );

4.       Außerdem habe ich einen ToolTip in die Anwendung integriert, der das DescriptionAttribute auswertet und ausgibt. Dazu muss kräftig in die ToolboxService-Klasse eingegriffen werden.

Die erste Änderung in der OnListBoxMouseMove

  692   int currentIndex = listBox . IndexFromPoint( new Point (e . X, e . Y));

  693   if (currentIndex >= 0 )

  694  {

  695      SelfHostToolboxItem item = listBox . Items[currentIndex] as SelfHostToolboxItem ;

  696      if (item == null || string . IsNullOrEmpty(item . Tooltip))

  697      {

  698          this . tooltip = null ;

  699  

  700          currentHighlightItemIndex = Int32 . MinValue;

  701      }

  702      else

  703      {

  704          {

  705              // ToolTip setzen

  706              if (currentHighlightItemIndex != currentIndex)

  707              {

  708                  this . tooltip = item . Tooltip;

  709                  currentHighlightItemIndex = currentIndex;

  710                  this . tp . Show(tooltip, this , new Point (e . X, e . Y));

   711              }

  712          }

  713      }

  714  }

Auf Klassenebene sind die 3 Fields definiert

  717   ToolTip tp = new ToolTip ();

  718   string tooltip;

   719   int currentHighlightItemIndex;

Außer den beschriebenen Anpassungen kann man sich durchaus auch noch kräftig in der OnDrawItem-Methode austoben, hier kann man die Anzeige den eigenen Wünschen anpassen.

Man muss/sollte in seinen Workflows-Assemblies unbedingt das XmlnsDefinitionAttribute verwenden und einen für sich eindeutigen Namespace definieren. Mittels des Attributes wird die Auflösung der Namepsaces im Xml (Xoml-Workflow) und der CLR gesteuert. Kommt es zu Problemen beim Laden der Workflows im Designer, obwohl der TypeProvider überall mitgegeben wird, so kann man sich mit einem Trick weiterhelfen. Das XmlnsDefinitionAttribute wird auf den CLR-Namespace gesetzt, zum Beispiel xmlns:cv="clr-namespace:DE.CapeVision.Workflow.MainActivities;assembly=CapeVisionMainActivityLib". Viel mehr Details dazu unter XAML Namespaces and Namespace Mapping.

Mittwoch, April 16, 2008

Schleifen in Workflow Foundation

Letzte Woche bin ich auf einen Effekt bei der Workflow Foundation gestoßen, der mir so nicht bewusst war und auch nur bedingt sinnvoll aus meiner Sicht.

Der Effekt tritt auf, wenn man eine Schleife benutzt und Werte innerhalb der Schleife abfragen möchte. Konkret trat das Problem auf, sobald ein IF-Branch verwendet wurde. Versucht man auf Ativitäten innerhalb der Schleife zu zugreifen, so sind die Werte/Variablen nicht gesetzt. Nach etwas Recherche in dem WF Buch von AWP, ist die Ursache klar, der ExecutionContext wird ständig neu Instanziiert. Im ExecutionContext sind alle Informationen enthalten, welchen Status hat die Ativity und Ergebnisse. Wird eine Activity geschlossen, was der normale Zustand nach der Fertigstellung ist, so ist die Activity im Status Closed. Aus dem Status Closed kann man eine Activity nicht wieder zurück in den „Executing“-Status setzen. Aus diesem Grund wird für jeden Schleifendurchlauf ein neuer Context erzeugt. In dem Buch sind entsprechende Code-Beispiele enthalten, wie man selber Schleifen erzeugen kann. Um nun aber an die Daten heranzukommen, die im aktuellen Schleifendurchlauf vorhanden sind, wird bei Schleifen eine Property zur Verfügung gestellt mittels der eine Abfrage des Inhalts möglich ist, für while-Acitivty ist es die Dynamic-Activity-Property. Eine Abfrage könnte dann etwa so aussehen:

    7  (( MyDataActivity )

    8      (( WhileActivity ) this . GetActivityByName ( "MeineWhileSchleife" ))

     9          . DynamicActivity . GetActivityByName ( "MyDataActivity" )) . MyDataProperty

Sieht kompliziert aus, aber leider bekommt man von der GetActivityByName-Methode nur den Activity-Typ, so dass die Casts notwendig sind. Leider habe ich kein Beispiel parat, aber zumindest ein bisschen Code für eine eigene Schleife werde ich nach liefern.

Evtl. morgen dann noch ein Posts zu Trouble mit den Custom-Activity und das laden im Designer (Custom Designer).

Update
Hier ist noch ein kleiner Nachtrag, leider nicht der Code der While-Activity. Ich hatte leider vergessen die entsprechende Anweisung zu erstellen. Dafür kann ich als alternative aber einige Artikel bzw. Auszüge aus dem Buch Essential Windows Workflow Foundation bieten, auf die gestoßen bin. Die Informationen sind unter http://codeidol.com/other/essential-windows-workflow-foundation/ einzusehen.Die While-Activity ist als Beispiel im Artikel Activity Execution Context beschrieben.

Sonntag, Dezember 30, 2007

Jahresrückblick 2007

Dieses Jahr war mal wieder ein Jahr mit vielen technischen Themen. Größte Themenblog im 1. Halbjahr war der BizTalk Server 2006. Hier vor allem der elektronische Rechnungsdatenaustausch und die Entwicklung bei einem Kunden, ebenfalls zum Thema Rechnungsaustausch und EDI. Ich habe wirklich viele Erfahrungen mit dem BizTalk gewonnen. Das Thema BizTalk begleitete mich immer weiter durch das Jahr, wirklich abgeschlossen war es nicht, allerdings nicht mehr so massiv. Im ersten Quartal war außerdem noch Erfahrung sammeln und Erweitern einer Fahrzeugtracking-Komponente bzw. Tour-/Auftragsübermittlung. War wirklich spannend und man sieht mal, was alles so als Produkt vertrieben wird. Interessant ist Fahrzeugtracking eigentlich für jeden Fuhrpark.

Das 2. Halbjahr war eigentlich das Thema Sharepoint führend. Also Sharepoint-Technologien 2007 sind wesentlich netter und interessanter als die Vorgänger, allerdings immer noch teilweise sehr „spannend“ im Verhalten. Dieses Problem führte in der letzten Woche zur Verschiebung eines GoLives einer Applikation. Dennoch ist Sharepoint auch für Webseiten eine Interessante Alternative, hier mal einige Beispiele von diesem Jahr, www.smartpath.de, www.callparts.de, ersatzteile.callparts.de. Alle diese Seiten nutzen leider noch nicht den gesamten Funktionsumfang des Sharepoints, allerdings kann das alles noch kommen. Mit dem Sharepoint wurde teilweise auch der Einsatz von Ajax-Technologien verbunden. Was sich allerdings ohne das angekündigte Service Pack 1 für Sharepoint als Schwierig gestaltete

Ein anderes Thema, dass im Zweiten Halbjahr Erfolge feierte, war die Einführung von Subversion bei uns. Bei uns meinte ich jetzt SD&C und CapeVision, wir Entwickler nutzen das bei CapeVision bereits als Standard, allerdings wurden bisher nur Sourcen abgelegt. Nach der geleisteten Überzeugungsarbeit im ersten Halbjahr bei einem Projektleiter, war die Einführung nicht mehr ganz so schwer. Die Geschäftsführung musste allerdings noch überzeugt werden. Auch der zweite involvierte Projektleiter stimmte für Subversion. Was allerdings für eine breite Akzeptanz fehlte, war die einfache Möglichkeit Projekte anzulegen. Zu diesem Zweck habe ich mich an die Entwicklung einer Applikation (natürlich in der Freizeit) gemacht, die die Anforderung abbilden kann. Meine erste Idee war die Realisierung auf Basis der BizTalk Technologie und Sharepoint, diese Idee musste ich verwerfen, da es schwieriger war als gewünscht. ABER es gab das .NET Framework 3.0, welches Workflow Komponenten (Workflow Foundation - WF) und Service Hosting Komponenten (Window Communication Foundation - WCF) enthält. Außerdem kam für das Front-End eine Web-Applikation mit Ajax Unterstützung zum Einsatz. Letztendlich sorgt die Applikation dafür, dass das Projekt als Repository angelegt wird, die Basis-Struktur nach derzeitigem KM (Konfigurationsmanagement)-Stand erzeugt wird, Benutzerrechte definiert werden und das Projekt-Ticketsystem Trac angelegt wird. Nun werden alle Dokumente (außer VMs) in das Repository eingecheckt.

Eine Technologie, die sich durch das ganze Jahr zog war die Virtualisierung. Dabei kamen bei uns beide großen Systeme Microsoft Virtual PC/Virtual Server und VMWare Workstation/Server zum Einsatz. Allerdings verschob sich im Laufe des Jahres alles Richtung VMWare aufgrund der besseren Unterstützung von Peripherie.

Noch wichtig zu erwähnen, dass im November endlich Visual Studio 2008 und das .NET Framework 3.5 released wurden. Hier sind auf jeden Fall die ASP.NET 3.5 Extension zu empfehlen! Ach ja, ich hab nach über 2,5 Jahren endlich den MCAD komplettiert.

Eine weitere Technologie des Jahres ist aus meiner Sicht Instant Messageing. Endlich setzt sich IM auch in Unternehmen zu nehmend durch. Wir sind auf Jabber/XMPP umgestiegen, da es uns leichter und unabhängig ermöglicht einen Server zu betreiben. Wir nutzen Openfire als Server, der sehr einfach aufzusetzen ist und sehr gute Unterstützung bietet. Bei den Clients wählt jeder nach belieben. Zum einen nutze ich PSI, Kollegen nutzen Spark, Miranda oder auch Trilian.