<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Workflow on csegura</title><link>https://blog.romheat.net/tags/workflow/</link><description>Recent content in Workflow on csegura</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 14 Feb 2007 00:00:00 +0100</lastBuildDate><atom:link href="https://blog.romheat.net/tags/workflow/index.xml" rel="self" type="application/rss+xml"/><item><title>Refactoring Session</title><link>https://blog.romheat.net/posts/2007/07_02_17_refactoring_session/</link><pubDate>Wed, 14 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_17_refactoring_session/</guid><description>&lt;p>Yesterday was the third act of NavarraDotNet, we had a session in the Public University of Navarra, where, we spoke about refactoring techniques and showing some tools as Resharper and Refactor!.&lt;/p>
&lt;p>My colleague in the session Sergio Jimenez, it demonstrated how using some of this inexpensive tools, we can improve the code quality, the development of some tasks, and how is it favorable for both, programmers and companies.&lt;/p>
&lt;p>Ayer tuvimos el tercer acto de NavarraDotNet, en la Universidad Publica de Navarra, en donde hablamos sobre técnicas de refactoring y pudimos ver algunas herramientas como Resharper y Refactor!.&lt;/p></description></item><item><title>Workflow Course 5</title><link>https://blog.romheat.net/posts/2007/07_02_14_workflow_course_5/</link><pubDate>Wed, 14 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_14_workflow_course_5/</guid><description>&lt;p>&lt;strong>5o Asalto – El servicio de planificación de tareas &amp;amp; Hosting in ASP.Net&lt;/strong>&lt;/p>
&lt;p>El servicio de planificación de tareas (&lt;strong>WorkflowSchedulerService&lt;/strong>)  es el encargado de ejecutar los distintos flujos de trabajo dentro del motor, estos pueden ser manejados de forma asíncrona, usando el servicio que WF nos proveed por defecto (&lt;strong>DefaultWorkflowSchedulerService&lt;/strong>) o de manera síncrona, usando un servicio manual (&lt;strong>ManualWorkflowSchedulerService&lt;/strong>).&lt;/p>
&lt;p>Al igual que el resto de servicios, también podemos crear nuestro propio servicio de planificación heredando de &lt;strong>WorkflowSchedulerService&lt;/strong>.&lt;/p></description></item><item><title>Workflow Course 3a</title><link>https://blog.romheat.net/posts/2007/07_02_13_workflow_course_3a/</link><pubDate>Tue, 13 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_13_workflow_course_3a/</guid><description>&lt;p>El proyecto WinHostWorkflow esta formado a su vez por dos proyectos, WinHostWorkflow contiene el motor de flujos de trabajo (WorkflowEngine.cs) y el interface de usuario (WorkflowSampleApp.cs), la carpeta ExternalDataServices, contiene los servicios de intercambio de datos del 3er asalto, (CalculatorService.cs y MessengerService.cs)&lt;/p>
&lt;p>El proyecto Workflows, contiene los interfaces para los servicios de intercambio de datos (ICalculator.cs y IMessenger.cs) así como los flujos de trabajo de ejemplo.&lt;/p>
&lt;ul>
&lt;li>WorkflowDelay.cs – Secuencial con una actividad Delay de 45seg.&lt;/li>
&lt;li>WorkflowDelay2.cs – Secuencial con una actividad Delay de 30 seg, una actividad Code que duerme el proceso un minuto y una actividad Delay de 30 seg.&lt;/li>
&lt;li>WorkflowLongWhile.cs - Seuencial con una actividad While que ejecuta una actividad Code.&lt;/li>
&lt;li>WorkflowSumNumbers.cs – Uso de parámetros, recibe dos parámetros y los suma en una actividad Code.&lt;/li>
&lt;li>WorkflowCallExternalMethod.cs - Llamada a métodos externos, usa el interface ICalculator, para realizar operaciones con parámetros.&lt;/li>
&lt;li>WorkflowHandleExternalEvent.cs - Espera recibir un mensaje, interface IMessenger, después hace una pausa y a través del mismo interface nos lo devuelve.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://blog.romheat.net/images/Sharepoint/wf_curso_20.gif" alt="">&lt;/p></description></item><item><title>Workflow Course 3</title><link>https://blog.romheat.net/posts/2007/07_02_04_workflow_course_3/</link><pubDate>Sun, 04 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_04_workflow_course_3/</guid><description>&lt;p>Cuando hablo de Workflow Foundation, siempre hay una parte en la que alguien me pregunta, ¿Cómo encajo todo esto en mi forma de trabajar?, bien, WF lo que nos permite es modelar procesos (pueden ser de negocio o de lo que sea).&lt;br>
 &lt;br>
Generalmente, y desde que adoptamos los modelos de n-capas, usamos una capa para albergar lo que denominamos lógica del negocio, (yo la llamo la capa lógica, a secas) y en esa capa implementamos los distintos procesos que nuestra aplicación va a realizar. En esta capa tenemos un nivel de abstracción elevado, ya que no trabajamos directamente con los datos, si no que usamos entidades que mapean los datos. A pesar de trabajar con este nivel de abstracción, en nuestro código debemos implementar gran cantidad de servicios, como: excepciones, estados, eventos, comunicaciones, transacciones. WF, lo que nos brinda es otro nivel más de abstracción mediante el cual vamos a poder centrarnos en la resolución de los problemas, liberándonos de gran parte de la carga.&lt;/p></description></item><item><title>Workflow Course 4</title><link>https://blog.romheat.net/posts/2007/07_02_14_workflow_course_4/</link><pubDate>Sun, 04 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_14_workflow_course_4/</guid><description>&lt;p>Muchos de los procesos con los que trabajamos habitualmente, requieren de datos o eventos que llegan desde el exterior. Anteriormente, vimos como WF puede comunicarse con el mundo exterior, para recibir esos datos o eventos usando el servicio de intercambio de datos.&lt;/p>
&lt;p>En ocasiones, al igual que sucede en el mundo real, debemos esperar a que se produzcan esos datos o eventos para poder continuar realizando un trabajo. Este hecho hace que nuestros flujos de trabajo queden inactivos (Idle) mientras esperan esos datos.&lt;/p></description></item><item><title>Workflow Course 2</title><link>https://blog.romheat.net/posts/2007/07_02_03_workflow_course_2/</link><pubDate>Sat, 03 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_03_workflow_course_2/</guid><description>&lt;p>Bueno, en la &lt;a href="https://web.archive.org/web/20130623100537/http://www.ideseg.com/CursoDeWorkflowFoundation1.aspx" target="_blank">&lt;strong>primera parte&lt;/strong>&lt;/a> hemos visto en que consiste el motor de flujos de trabajo, poco a poco nos iremos introduciendo en los detalles, también hemos visto que un flujo de trabajo esta compuesto de actividades. Cuando ejecutamos un flujo de trabajo dentro del motor, la representación del mismo (&lt;strong>SequentialWorkflowActivity ó&lt;/strong>  &lt;strong>StateMachineWorkflowActivity)&lt;/strong> en ejecución es un &lt;strong>WorkflowInstance.&lt;/strong>&lt;/p>
&lt;p>Esta instancia, se crea desde el motor, Runtime.CreateWorkflow(typeof(&lt;!-- raw HTML omitted -->)) y como vimos existen distintas formas de cargar los flujos de trabajo dentro del mismo, (más adelante veremos como hacerlo de otras maneras).&lt;/p></description></item><item><title>Workflow Course 1</title><link>https://blog.romheat.net/posts/2007/07_02_01_workflow_course_1/</link><pubDate>Thu, 01 Feb 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_02_01_workflow_course_1/</guid><description>&lt;p>Tenía que impartir un curso de &lt;strong>Workflow Foundation&lt;/strong> que finalmente no voy a dar, ya que estoy muy liado con otros temas. Ayer por la noche pensé que era una pena desaprovechar todo este trabajo, más aún porque estaba deseando montar un curso distinto, me explico:&lt;/p>
&lt;p>El curso iba a consistir de 10 clases de una hora y media de duración (usease 15 horas) que no es mucho. De modo que tenía pensado lo siguiente. Una introducción de 45 minutos explicando cosas y mostrando un ejemplo práctico, ejemplo que previamente habría diseñado para la ocasión. Los 45 minutos restantes iban a ser para (30 min) que la gente trabajara con el código del ejemplo y lo enredara (mientras yo les explicaba el código). Por último, entre todos (siguiendo unas directrices 15min) iríamos añadiéndole funcionalidad al código, para ir viendo cada cosa en profundidad en la siguiente clase.&lt;/p></description></item><item><title>Use Wfpad in your apps</title><link>https://blog.romheat.net/posts/2007/07_01_25_wfpad/</link><pubDate>Thu, 25 Jan 2007 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2007/07_01_25_wfpad/</guid><description>&lt;p>&lt;a href="https://web.archive.org/web/20130623124824/http://blogs.msdn.com/markhsch/default.aspx" target="_blank">Mark Schmidt’s&lt;/a> a puesto una última versión del &lt;strong>&lt;a href="https://web.archive.org/web/20130623124824/http://blogs.msdn.com/markhsch/archive/2007/01/23/wfpad-for-windows-workflow-foundation-rtm.aspx" target="_blank">WFPad&lt;/a>&lt;/strong>, para Windows Workflow Foundation. Lo acabo de bajar para jugar un poquito, para los que aún no lo sepan, este ejemplo es el mejor ejemplo que hay sobre como integrar el Diseñador de flujos de trabajo dentro de nuestras aplicaciones.&lt;/p>
&lt;p>&lt;img src="https://blog.romheat.net/images/Sharepoint/wfpad.gif" alt="">&lt;/p>
&lt;p>Justito lo he compilado y añadido mi propia biblioteca de actividades (sin ir más lejos la que he creado hoy en el evento de la UPNA, mañana pondré fotos). Podéis ver FritoDeGamba y Visor de eventos.&lt;/p></description></item><item><title>conv.u</title><link>https://blog.romheat.net/posts/2006/06_12_31_conv_u/</link><pubDate>Sun, 31 Dec 2006 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2006/06_12_31_conv_u/</guid><description>&lt;p>Este será casi con seguridad mi último post del 2006, pero eso no lo puedo asegurar ya que cuando me pica la curiosidad, siento esa irresistible necesidad de saciarla. Y eso es lo que me ha ocurrido esta mañana. Como había comentado antes no había usado punteros en c# y este hecho me ha picado, de modo que he tratado ver como son manejados por el CLR.&lt;/p>
&lt;p>Bien, todo era normal hasta que he visto este código IL en donde no entendía el misterioso conv.u, el código que estaba usando es el siguiente:&lt;/p></description></item><item><title>Workflows SPDesigner 2</title><link>https://blog.romheat.net/posts/2006/06_12_08_workflows_spdesigner_2/</link><pubDate>Sat, 09 Dec 2006 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2006/06_12_08_workflows_spdesigner_2/</guid><description>&lt;p>Para añadir una nueva actividad a nuestro SPD, lo primero que debemos hacer es comenzar un proyecto de Workflow, en concreto un Workflow Activity Library (Biblioteca de actividades para el flujo de trabajo).&lt;/p>
&lt;p>&lt;img src="https://blog.romheat.net/images/Sharepoint/SWA_%5B1%5D.gif" alt="">&lt;/p>
&lt;p>A partir de ese punto crearíamos nuestra actividad, para este ejemplo voy a crear una actividad que consiste en enviar un texto al visor de eventos.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-csharp" data-lang="csharp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">partial&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">LogEventViewer&lt;/span> : Activity
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> DependencyProperty TextLogProperty =
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DependencyProperty.Register(&lt;span style="color:#960050;background-color:#1e0010">“&lt;/span>TextLog&lt;span style="color:#960050;background-color:#1e0010">”&lt;/span>, &lt;span style="color:#66d9ef">typeof&lt;/span>(&lt;span style="color:#66d9ef">string&lt;/span>), &lt;span style="color:#66d9ef">typeof&lt;/span>(LogEventViewer));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> LogEventViewer()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> InitializeComponent();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;summary&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// Valor que figurará en el visor de eventos&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;/summary&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;value&amp;gt;Texto&amp;lt;/value&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e"> [Description(&amp;#34;Texto que saldrá en el visor de eventos&amp;#34;)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e"> [Category(&amp;#34;User&amp;#34;)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e"> [Browsable(true)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e"> [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">string&lt;/span> TextLog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">get&lt;/span> { &lt;span style="color:#66d9ef">return&lt;/span> (&lt;span style="color:#66d9ef">string&lt;/span>) GetValue(TextLogProperty); }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">set&lt;/span> { SetValue(TextLogProperty, &lt;span style="color:#66d9ef">value&lt;/span>); }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;summary&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// Ejecución de la actividad&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;/summary&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;param name=”provider”&amp;gt;Contexto de ejecución de la actividad&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">protected&lt;/span> &lt;span style="color:#66d9ef">override&lt;/span> ActivityExecutionStatus Execute(ActivityExecutionContext provider)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> EventLog eventLog = &lt;span style="color:#66d9ef">new&lt;/span> EventLog(&lt;span style="color:#960050;background-color:#1e0010">“&lt;/span>Workflow&lt;span style="color:#960050;background-color:#1e0010">”&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> eventLog.Source = &lt;span style="color:#960050;background-color:#1e0010">“&lt;/span>SharePoint Workflow&lt;span style="color:#960050;background-color:#1e0010">”&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> eventLog.WriteEntry(TextLog, EventLogEntryType.Information);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">finally&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> eventLog.Dispose();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> ActivityExecutionStatus.Closed;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Lo primero que hacemos es declarar una propiedad dependiente del flujo de trabajo llamada TextLogProperty, a través de la cual pasaremos el texto que deseamos visualizar en el visor de eventos.&lt;/p></description></item><item><title>Workflows SPDesigner 1</title><link>https://blog.romheat.net/posts/2006/06_12_08_workflows_spdesigner_1/</link><pubDate>Fri, 08 Dec 2006 00:00:00 +0100</pubDate><guid>https://blog.romheat.net/posts/2006/06_12_08_workflows_spdesigner_1/</guid><description>&lt;p>Sin duda una de las mejores cosas de MOSS 2007 es el nuevo SPD, y dentro de este, el diseñador de flujos de trabajo, que nos permite de forma ágil y sencilla diseñar nuestros flujos de trabajo.&lt;/p>
&lt;p>Aunque como he comentado en otras ocasiones, si deseamos realizar flujos de trabajo más complejos, o máquinas de estados debemos usar Visual Studio.&lt;/p>
&lt;p>SPD, solo nos permite realizar workflows secuenciales con las actividades que vienen predeterminadas. Sin embargo existe la posibilidad de ampliar las actividades básicas que nos encontramos dentro de SPD, con lo cual podemos extender la funcionalidad de nuestros workflows sin llegar a realizarlos completamente en Visual Studio.&lt;/p></description></item></channel></rss>