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.
Mittwoch, April 22, 2009
SOA Conference 2009 Videos and Slides
Eingestellt von
Jan Zieschang
um
08:02
0
Kommentare
Tags: dev, wcf, workflow foundation
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.
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.
Eingestellt von
Jan Zieschang
um
21:18
0
Kommentare
Tags: ASP.NET, dev, Sharepoint, wcf, workflow foundation
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 OnListBoxMouseMove692 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 definiert717 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.
Eingestellt von
Jan Zieschang
um
19:45
3
Kommentare
Tags: dev, workflow foundation
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.
Eingestellt von
Jan Zieschang
um
21:47
0
Kommentare
Tags: dev, workflow foundation
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.
Eingestellt von
Jan Zieschang
um
13:29
0
Kommentare
Tags: ASP.NET, dev, Jabber, Off-Topic, SCM, Sharepoint, wcf, workflow foundation