WF - Out-Of-The-Box Activities Ornekleri 2


Merhaba Arkadaşlar;

Lafı uzatmadan aktivitelere Devam ;)

InvokeWorkflow Activity

Bu aktivite, daha önceden tasarladığımız bir akış içerisinden, farklı bir iş akışını çağırmak için kullanılır. Kendinize ait bir Workflow Framework yaratmaya karar verdiğiniz durumda, işinizi çok kolaylaştıracaktır. InvokeWorkflow aktivitesi, çağırılan iş akışına göre değişiklik gösterebilir. Bunu bir örnek ile açıklamak gerekirse, dışarıdan çağırılacak olan iş akışı eğer parametre alacak ise, InvokeWorkflow aktivitesi bünyesinde değişiklikler yapılması gerekmektedir.

Yeni bir proje yaratalım ve daha sonra bu projemizin içerisine ek olarak bir Sequential Workflow (code) ekleyelim.

 

 

Bu uygulama için bir Dependency Propert tanımlayacağım.

Dependency Property;

.NET property’lerine oldukça benzemektedir, fakat Dependency property’ler konsept olarak çok daha güçlü ve komplekstir. Aralarındaki en önemli fark, normal bir  .NET property’sinin değeri sınıfta tanımlanmış private bir üyeden direkt olarak okunur.

Bir dependency property’nin değeri ise GetValue() metodu çağrıldığında dinamik olarak çözümlenir. Bir dependency propertynin değerini set ettiğimizde bu nesnemizin bir alanında saklanmaz onun yerine DependencyObject temel sınıfı tarafından sağlanan bir dictionary de saklanmaktadır. Bildiğiniz gibi dictionary’ler key ve value dan oluşmaktadır. Giriş key dediğimiz property ismi, value ise set etmek istediğimiz değeri tanımlamaktadır.

Dependency property’lerin avantajlarından en önemlileri bellek dağıtık kullanımını azaltma, değer kalıtımı ve property değişim bildirimi olarak sıralayabiliriz. Burada değer kalıtımı dediğimiz bir dependency property’e eriştiğimizde değeri, değer çözümleme stratejisi kullanılarak çözümlenir. Eğer lokal bir değer ayarlanmamış ise, dependency property bir değer buluncaya kadar mantıksal ağaçta bir üste yönlenirler.

Bu açıklamadan da sonra bir de kod tarafında bu property’in tanımlamasını gerçekleştirelim.

 

using System;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Collections;

using System.Workflow.ComponentModel.Compiler;

using System.Workflow.ComponentModel.Serialization;

using System.Workflow.ComponentModel;

using System.Workflow.ComponentModel.Design;

using System.Workflow.Runtime;

using System.Workflow.Activities;

using System.Workflow.Activities.Rules;

namespace WhileAktivitesi

{

    public sealed partial class Workflow2 : SequentialWorkflowActivity

    {

        public static DependencyProperty dpProb = DependencyProperty.Register("Bilgi", typeof(string), typeof(Workflow2));

        public string Bilgi

        {

            get { return (string)base.GetValue(dpProb); }

            set { base.SetValue(dpProb, value); }

        }

        public Workflow2()

        {

            InitializeComponent();

        } 

        private void bilgiGetir(object sender, EventArgs e)

        {

            Console.WriteLine("Bilgi " + this.Bilgi);

        }

    } 

}

Şimdi ise InvokwWorkflow için gerekli olan işlemleri ve tanımlamaları yapalım. Workflow1.cs [Design] tarafına geçelim ve Sequntial Workflow bölümüne, toolbox dan InvokeWorkflow aktivitesini sürükleyerek bırakalım.

 

Burada kırmızı kutu içerisine aldığım yerdeki uyarı, neredeki workflow’u çağıracağını daha belirmediğim için gösterilmektedir. Workflow2 çağırması gerektiğini tanımladıktan sonra bu uyarı kalkacaktır. InvokeWorkflow’un properties penceresinden TargetWorkflow özelliğini, workflow2’yi hedef gösterecek şekilde ayarlayalım.

 

Bu işlemlerden sonra, projemizi derlememiz gerekiyor. En son ekran çıktısı aşağıdaki gibidir.

 

Son olarak Bilgi özelliğine istediğinizi yazabilirsiniz.

 

 

Paralel Activity

Paralel aktivite adını düşününce, acaba asenkron mu çalışıyor diye bir soru aklınıza gelebilir. Thread yapılarını bilirsiniz, eğer bir asenkron işlem yapılacaksa bunun için en az iki kanal yapısına ihtiyaç duyarız. WF de bütün işlemler tek kanal üzerinde gerçekleştiği için, asenkron çalışması mümkün değildir. Paralel aktivitenin görevi, daha önceden belirttiğim gibi, iki farklı koldan, eş zamanlı çalışılmasına olanak tanır. Şimdi düşünebilirsiniz hem iki farklı kol var hem de aynı anda çalışıyorlar ama tek kanal da, bu nasıl oluyor ? 1. Sequence’in ilk aktivitesi devreye girdiğinde, direk olarak 2. Sequence’in 1. Aktivitesine yönlenecek ve aktif hale gelecektir. Sonradan 2. Sequence den 1. Sequence doğru gidecek ve 2. Aktiviteyi çalıştıracaktır ve buradan 2. Sequence gidip 2. Aktiviteyi çalıştıracaktır. Bu şekilde aslında iki kolda, iki yönde çalışıyor gibi gözükebilir ama aslında tek bir yok izlemektedir.

Paralel aktivitenin her kolunda bir sequence aktivitesi bulunur ve yukarıdaki yolu izleyerek, iki kolu da idare ederler. Aşağıda buna örnek bir ekran görüntüsü bulunmaktadır

 

 

 

Delay Activity

Bu aktivitenin milisaniye bazında çalıştığını daha önce ifade etmiştik. İş akışımızı milisaniyeler bazında ayarlamak istiyorsak bu aktivite bize yardımcı olacaktır.  Delay Activity’nin Timeout özelliğini istediğiniz süreye ayarlayabilirsiniz.

 

 

Suspend Activity

Çalışan iş akını beklemeye almak isterseniz, Suspend Activity’i kullanmalısınız. Bekleme durumuna geçer geçmez, arka planda WorkflowRuntime bir hata mesajı yakalar ve WorkflowSuspend event’ı yakalanır. Eğer bu bekleme durumundan çıkmak isterseniz, o zaman WorkflowInstanse’ın Resume metodundan yararlanmanız gerekir.

Bunu bir örnek uygulama ile açıklayalım. Yeni bir Sequential Workflow Console Application projesi yaratalım. Sequential Workflow bölümüne, toolbox’dan Suspend Activity’i sürükleyerek bırakalım. Daha sonra kod tarafına geçip bir string tipinde property tanımlaması yapalım.

 

 

using System;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Collections;

 

using System.Workflow.ComponentModel.Compiler;

using System.Workflow.ComponentModel.Serialization;

using System.Workflow.ComponentModel;

using System.Workflow.ComponentModel.Design;

using System.Workflow.Runtime;

using System.Workflow.Activities;

using System.Workflow.Activities.Rules;

 

namespace ParalelAktivite

{

    public sealed partial class Workflow1 : SequentialWorkflowActivity

    {

        public string Bilgi { get{return "Beklemeye alındı !"; } }

 

        public Workflow1()

        {

            InitializeComponent();

        }

     

    }

 

}

 

 

Suspend aktivitesinin properties penceresindeki, error özelliğinden, kod tarafında yaratmış olduğumuz, Bilgi adındaki Property’e ulaşalım ;)

 

 







Blog Posts' Cloud