Windows Workflow Foundation

Eyl 08, 2013

Microsoft’un .Net Framework 3.0 ile getirdiği Windows Workflow Foundation, projelerdeki iş akışlarının hayata geçirilmesinin zorlaştığı anlarda devreye giren ve işlerin ölçeklenebilmesini sağlayan bir teknolojidir. WWF teknolojisi ile daha görsel iş akışı tasarımlarının yapılabilmesi sağlanmak istenmektedir ve bu görsellik ile bu kişilerin analiz yapma becerilerini ön plana çıkararak geliştirilen uygulamaların başarı oranının da yükseltilmesi hedeflenmektedir. Ancak, Windows Workflow Foundation ile ilgili bir şeyler öğrenmeye başlamadan önce iş akışı (Workflow) kavramını iyi kavramak gerekir.

Dünyadaki pek çok iş probleminin çözümünde akışlarından(workflow) faydalanılması, yazılımcılara ve tasarımcılara büyük kolaylıklar sağlar. Bu da var olan problemin önce küçük parçalara bölünmesi ile başlar. Daha sonra gerekli görevler(tasks), adımlar(steps), koşullar(conditions) belirlenir. Bunun sonucunda kontrollü bir akış yani bir iş akışı (Workflow) ortaya çıkar. Kısaca iş akışı(Workflow), bir öğenin aktörler arasındaki dolaşımı esnasında izleyebileceği adımların bir araya gelmesidir.

İş Akışı Tipleri

3 adet iş akış tipi vardır.

     1. Sıralı İş Akışı (Sequential Workflow)

Bu iş akışının özelliği, içinde bulundurduğu aktiviteleri adım adım çalıştırmasıdır. Bu akış, içerisinde kontrol ya da karar yapısı içerebilir. If veya While yapısı bunlara örnek olarak gösterilebilir.



Yukarıdaki diyagramda sıralı iş akışının (sequential workflow) başlamasıyla beraber bir dökümanın kontrol edilip onaylanması veya onaylanmaması durumunda izlenebilecek farklı yollar ve işlemler gösteriliyor.

Başka bir benzer örnek de verilecek olunursa; elde müşteriye yollanılacak olan  bir dokümanın olduğu varsayılabilir. Bu dokümanın ilk önce A kişisinin dokümanı gözden geçirmesi, B kişisinin onaylaması ve C kişisinin de bu dokümanı müşteriye yollaması gerekiyorsa sıralı iş akışı (Sequential Workflow), bu ve benzeri iş problemlerinde ideal bir seçim olacaktır.

2. Olay-Yönlendirmeli İş Akışı (State Machine Workflow & Event-Driven Workflow)

Sıralı iş akışı veya Olay-Yönlendirmeli iş akışından hangisinin kullanılacağına karar verilebilmesi için önce kontrolün kimin elinde olacağına karar verilmesi gerekir.

Sıralı iş akışları önceden tahmin edilebilirdir. Çalıştırılan program belli bir döngünün içine girebilir, önceden belirtilmiş şekilde sonlanabilir veya dışarıdan tetiklenebileceği bir olayı bekleyebilir. Ancak en sonunda kaçınılmaz bir şekilde ileriye doğru bir akış gerçekleşecek ve  koşullar, kurallar ve aktiviteler kullanılacaktır. Burada kontrolü elinde tutan taraf iş akışıdır.

Olay-Yönlendirmeli iş akışı(Event-Driven Workflow) adı üstünde dışarıda gerçekleşen olaylara bağlıdır ve sonlanabilmesi için dışarıdaki olaylar tarafından tetiklenmesi gerekir. Olay-Kontrollü iş akışlarında amaç mevcut durumu değiştirmektir. Ancak bu durumun değişmesi için önceden belirlenmiş olan bir olayın çalıştırılma zorunluluğu vardır.  Genel olarak önemli olan kararlar akışın dışında gerçekleşir. Olay yönlendirmesinde sadece izlenecek yapı belirlenir ancak, kontrol dış dünyadadır.




Yukarıdaki iş akışında şu anki mevcut Durum(State) ile dış dünyaya bağlı olan Olay(Event)'ların arasındaki ilişki gösterilmektedir.


 

 

3. Veri-Yönlendirmeli İş Akışı (Data-Driven Workflow)

Günümüzde kullanımının geniş alanlara kadar yayılması potansiyelini barındıran Veri-Yönlendirmeli iş akışlarının önemi büyüktür. Veri-Yönlendirmeli iş akışları, sıralı veya olay-yönlendirmeli iş akışları gibi somut olarak anlatılamasa da örnekler üzerinden gidilebilir:

Bir mağazanın stoklarında kullanılan malzemelerin bazılarının bozuk çıkması durumunda ne yapılacağının kestirilmesi veya stokların belli bir sayının altına inmesi durumunda önlemlerin alınması ve sistemin ne yönde tepki vereceği bu iş akışları ile sağlanır.

Başka bir örnek : Sayısız can ve mal kaybına neden olan fırtına ve hortumların oluşması olası yerlerde gözüken belirtilere dayanarak(veriler toplanarak), gelişmiş radar sistemleri aracılığıyla yeryüzünün taranması ve alınan verilere göre bir yönlendirme yapılarak olası can ve mal kaybının engellenmesi…

 

Windows Workflow Foundation'ın Getirileri

  • Yeni iş akışları geliştirmek için program yazanlara esnek ve güçlü bir çalışma ortamı sağlar. Böylece kullanıcıların kendi çalışma ortamlarını oluşturmak için zaman harcamaları engellenmiş olur.
  • Geliştirilen uygulamanın tutarlı olmasına katkıda bulunur ve verimliliği artırır.
  • Mevcut aktiviteler kullanılarak kullanıcıların kendi özel aktivitelerinin oluşturulmasında temel teşkil eder.
  • Tasarım zamanında ya da çalışma zamanında, kaynak kodda hiçbir değişiklik yapmadan iş akışı değiştirilebilir. Çünkü uygulamanın mantığı, kaynak kodun içinde değil,  ayrı olarak iş akışının içinde önceden belirtilmiştir.
  • Özellikle iş hayatında karşılaşılan problemlerde, üretilmesi gereken uzun süreli çözümler açısından yazılım geliştiriciler için uygulama yazmayı çok daha kolay bir hale getirir.

 

 

Visual Studio'da WWF(Windows Workflow Foundation) ile uygulama oluşturabilmeyi mümkün hale getiren bir toolbox(Araç Kutusu) ve bunun içinde de aktiviteler mevcuttur.

Toolbox(Araç Kutusu) Aktiviteleri

1.  Code Activity (Kod Aktivitesi)

İş akışının içerisine kullanıcının kendi kodunu koymasını sağlayan aktivite türüdür. Özel (Custom) aktivite olarak da algılanabilir. Sürükle-bırak yöntemiyle eklenen aktivitenin üzerine çift tıklandığında, kullanıcı kendi kodunu girebilir. İş akışı, kodu çalıştırıp sonlandırdıktan sonra çalışmaya devam eder. Kod aktivitesi sadece aynı iş akışı içerisinde kullanılabilir ve o iş akışında tekrar kullanılması çok nadirdir.

 

2.  Compensate Activity (Geri döndürme aktivitesi)

Bu aktivite, iş akışı içerisinde bir hata ile karşılaşıldıktan sonra yapılan işlemlerin geri alınmasını sağlamak için kullanılır. Hata alınca sonlanan bir işlemin(transaction) geri döndürülmesi(rollback) olarak da düşünülebilir.

 

3.  Conditioned Activity Group (Koşullu Aktivite Grubu)

İçerisine eklenen aktiviteleri belirli bir koşul temeline göre çalıştırabilen aktivite türüdür. Eklenen aktiviteler “Child Activity” olarak adlandırılır. Conditioned Activity Group’un içerisinde bulunan tüm aktivitelerinde “WhenCondition” adı verilen koşul yapısı bulunur. İçerisine eklenen her aktivite için “When” koşulunun yürütülmesi gerekir.

 

4.  Delay Activity (Gecikme Aktivitesi)

Gecikme aktivitesi genelde iş akışı içerisindeki uzun sürebilecek olan akışlarda, dışarıdan çağrılan nesnelerin işlemlerini tamamlaması beklenilen durumlarda kullanılır. Milisaniye bazında bekletme işlemi yapar.

 

5.  EventDriven Activity (Olay Yönlendirmeli Aktivite)

Windows Workflow Foundation’un en önemli aktivitelerinden biridir. Olay-Yönlendirmeli iş akışları ile sıralı iş akışları arasında geçişi sağlar. Başka bir görevi de, içerisinde bulundurduğu diğer aktiviteleri belirtilen bir olay gerçekleştiğinde çalıştırmaktır.

 

6.  FaultHandler Activity (Hata Yakalama Aktivitesi)

C# içindeki “catch” bloğu gibi çalışır. Temel olarak hataları, istisnai durumları ya da özel olarak belirttiğimiz nesneleri izler. Hata çıktığında içerisinde barındırdığı alt aktiviteleri çalıştırır. FaultHandler aktivitesinin hangi hatayı izlemesi gerektiği, “Fault” özelliğine değer atanarak belirlenebilir.

 

7.  If-Else Activity (Koşul Aktivitesi)

Yaptığı şey belirli bir koşul altında içinde bulunan koşul bölümlerinden birini çalıştırmaktır. Altında bulunan ilk bölüm mutlaka bir koşul bulundurmalıdır. İlk bölümde bulunan koşul “If” bloğudur. Son bölüm ise “else” bloğunu temsil eder. Burada bir koşul eklememiz zorunlu değildir.

 

8.  Invoke Web Service Activity (Web Servisi Çağırma Aktivitesi)

İş akışı içerisinden herhangi bir web servisini çağırmak(invoke) için kullanılır.

 

9.  Listen Activity (Dinleme Aktivitesi)

İçerisinde sadece Event-Driven Activity’leri(Olay-Yönlendirmeli) bulundurabilir. İçindeki bir Event-Driven Activity kendine ait olan olayı yakaladığında diğer Event-Driven Activity’ler iptal edilir. Dinleme aktivitesi bir sıralı akış aktivitesidir ve olay yönlendirmeli iş akışı içerisinde kullanılamaz.

 

10.  Parallel Activity (Paralellik Aktivitesi)

İçinde alt sıralı iş akışları(Child sequence workflow) bulundurur. Ana iş akışı çalışırken bir yandan da eş zamanlı olarak bunlar çalıştırılır. İç taraftaki sıralı iş akışları(Child Sequence Workflows)  bittikten sonra ana iş akışına devam edilir.

 

11.  Policy Activity (Kural Aktivitesi)

İş akışı içerisinde kurallar tanımlanabilen aktivitedir. Koşul(IfElse) aktivitesine çok benzerdir. Akış içerisinde küçük kontrol mekanizmaları kullanılacaksa ve koşul sonunda akış içerisinde bir değişiklik olmayacaksa Policy aktivitesini kullanmak daha doğru olacaktır.

 

12.  Replicator Activity (Klonlama Aktivitesi)

Replicator Activity, C# içerisindeki foreach deyimine benzer. Tek bir alt aktiviteden birden fazla kopya oluşturur ve kopyaları çalıştırır. Bir veri koleksiyonu içerisindeki nesne tabanlı alt aktiviteden birden fazla örnek oluşturur ve bu örnekleri çalıştırır. Asıl kullanım yeri Veri-yönelimli(data-driven) iş akışlarıdır. Replicator Activity, işleri hem sıralı(Sequential) hem de Paralel(Parallel) olarak yapabilme özelliğine sahiptir.

 

13.  Sequence Activity (Sıralama Aktivitesi)

Yalnız tek bir alt bölüm bulundurabilen ve içerisinde bulundurduğu aktiviteleri belirlediğimiz sıraya göre çalıştırmaya yarayan aktivitedir.

 

14.  SetState Activity (Durum Belirtme Aktivitesi)

Olay-yönlendirmeli iş akışları içerisinde kullanılır. Durum (State) aktiviteleri arasındaki geçişi sağlayan aktivitedir.

 

15.  State Activity (Durum Aktivitesi)

Olay-yönlendirmeli iş akışlarının en önemli parçasıdır. StateInitialization, StateFinalization ve State olmak üzere 3 ayrı duruma sahiptir. StateInitialization başlangıç durumunu ifade eder. StateFinalization bitiş durumunu ifade eder. State ise ara durumları ifade eder.

 

16.  StateInitialization Activity (İlk Durum Aktivitesi)

State başladığında herhangi bir EventDriven aktivitesi çalışmadan iş akışımız içerisinde bazı işler yapmak istersek burada StateInitialization aktivitesini kullanırız. StateInitialization aktivitesi tam olarak State aktivitesine ilk girildiğinde çalışmaktadır.

 

17.  Suspend Activity (Bekletme Aktivitesi)

Çalışan bir iş akışı içerisinde herhangi bir hata ile karşılaşıldığında, çalışma durumu beklemeye alınıp hatanın çıkma nedeni anlaşılabilir. Bu bekletmeyi yapabilen aktivitedir. İş akışına tekrar devam edilebilmesi için iş akışı yeniden başlatılır.

 

18.  Terminate Activity (Sonlandırma Aktivitesi)

Uygulama içerisinde bir hata ile karşılaşıldığında akışı durdurur. Bekletme aktivitesinden farkı, bekletmek yerine uygulamayı sonlandırmasıdır.

 

19.  Throw Activity (Fırlatma Aktivitesi)

İş akışı içerisinde meydana gelen bir hatayı diğer aktivitelere haber vermek için kullanılır.

 

20.  TransactionScope Activity (İşlem Denetleme Aktivitesi)

İçerisindeki aktiviteleri aynı işlem(transaction) kapsamı altında çalıştırarak, bu aktivitelerin tek bir iş gibi çalışmasını sağlar. Çalışma esnasında TransactionScope kapsamındaki aktivitelerin herhangi birinde bir problem ile karşılaşılırsa gerçekleştirilen işlemler geri alınır ve kapsam içerisindeki aktiviteler işe başlamadan hangi durumda iseler o duruma getirilirler.

 

21.  While Activity (Koşul Döngüsü Aktivitesi)

While aktivitesinin koşulu doğru(true) olduğu sürece içindeki aktiviteleri çalıştırmaya devam eden aktivitedir. C# dilindeki while teriminin Windows Workflow Foundation’daki karşılığıdır.

 

XAML nedir?

EXtensible  Application Markup Language (XAML), .Net uygulamaları için statik ya da dinamik kullanıcı arayüzleri oluşturmak için Microsoft’un geliştirmiş olduğu yeni bir markup(işaretleme) dilidir. Nesneleri, özelliklerini ve bunların birbirleriyle olan ilişkilerini tanımlar. Arayüz tanımlamaya yönelik olduğundan dolayı da program kodundan ayrı yazılır. XML tabanlı çalışır ve XML'in tüm özelliklerini kullanır. Uzantısı *.xaml dir. XML için geçerli olan tüm kurallar XAML için de geçerlidir.

 

XAML neden kullanılır?

  • XAML dilinin en büyük avantajlarından birisi dizayn ve geliştirmeyi(kod yazımı) birbirinden ayırmasıdır ki bu da yazılım ve grafik arayüzü geliştiricilerinin işbirliğinin artırılmasına yardımcı olur.
  • Kullanıcı arayüzleri oluşturmak XAML ile çok basittir.
  • Önceki UI Dizayn teknikleri için kullanılan kodlardan daha kısadır.
  • Dinamik arayüz geliştirmek XAML ile çok kolaydır.
  • Dizayn edilen arayüzün diğer ortamlarda taşınması ve sunulması çok kolaylaşır.

 

Windows Workflow Foundation’da iş akışları oluştururken sadece C#, sadece XAML veya ikisi birden projelerde kullanılabilir.



 

Uygulama

  1. Visual Studio'da Create New Project(Yeni proje oluştur)'e tıklanır. Workflow(İş akışı) sekmesi altından Sequential Workflow Console Application(Sıralı iş akışı konsol uygulaması) seçilir ve OK(Tamam)'e basılır.




  2. Projede XAML kodları da çalıştırılacağı için Solution Explorer'da bulunan .cs uzantılı olan iş akışı dosyası silinir.




  3. Solution Explorer'daki projenin üzerine sağ tuşla tıklanır ve Add New Item(Yeni nesne ekle) seçilir. Daha sonra Sequential Workflow with code seperation(Kod ayrımlı sıralı iş akışı) seçildikten sonra Add(Ekle)'a tıklanır. Buradaki "with code seperation" kısmı kaynak koddan farklı olarak XAML gibi dillerin de ayrı olarak kullanılacağı anlamına gelmektedir.




  4. Eklenilen .xoml uzantılı dosya herhangi bir XML editor ile açılarak XAML ile yazılmış arka plan kodları görülebilir. XML editörle açmak için .xoml uzantılı dosyaya sağ tuşla tıklanır ve "Open with(Birlikte aç)"'e basılıp XML editor seçilir. Herhangi bir aktivite eklemek için 2 seçenek vardır. Biri sürükle-bırak yöntemiyle toolbox(Araç Kutusu)'dan görsel olarak eklemek, ikincisi ise XML editör ile açtığımız XAML kodunun içerisine yazarak eklemektir. Gerekli aktiviteleri ekledikten sonra iş akış diyagramının görüntüsü aşağıdaki gibi olacaktır. Bu aktiviteler sırasıyla yukarıdan aşağıya doğru da eklenebilir veya herhangi bir şeyin unutulmasına karşılık istenilen yere de daha sonradan eklenebilir.




    Yukarıdaki diyagramdaki kırmızı ünlemlerin anlamı döngülerin tamamlanması için gerekli koşulların ve kodların aktivite içerisine eklenmemelerinden dolayıdır. Aşağıdaki XAML kodları ise XML editor kullanılarak görüntülenebilir ve değiştirilebilir.

    <SequentialWorkflowActivity
    x:Class="WorkflowConsoleApplication1.Workflow1"
    x:Name="Workflow1"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"
    <CodeActivity x:Name="codeActivity1" />
      <WhileActivity x:Name="whileActivity1" Condition="{x:Null}">
      <IfElseActivity x:Name="ifElseActivity1">
        <IfElseBranchActivity x:Name="ifElseBranchActivity1">
          <CodeActivity x:Name="codeActivity2" />
        </IfElseBranchActivity>
        <IfElseBranchActivity x:Name="ifElseBranchActivity2">
          <CodeActivity x:Name="codeActivity3" />
        </IfElseBranchActivity>
        </IfElseActivity>
      </WhileActivity>
    </SequentialWorkflowActivity>

  5. While ve IfElse aktivitelerinin içerilerine koşullar eklemeden önce bu koşullarda kullanılacak olan bir değişken belirlenir. Daha sonra da problemin çözümünü sağlayacak olan sınıf(class) en üstteki kod aktivitesi içerisinde kullanılmak üzere yazılır.


    namespace WorkflowConsoleApplication1
    {
       public partial class Workflow1 : SequentialWorkflowActivity
          {
             public Int32 sayi;
          }
    }

    public static class AsalSayi
    {
       public static bool asalMi(int candidate)
       {
          while (candidate == 1)
            return false;
          if ((candidate & 1) == 0)
          {
            if (candidate == 2)
            return true;
            else
            return false;
          }
          int num = (int)Math.Sqrt((double)candidate);
            for (int i = 3; i <= num; i += 2)
            {
               if ((candidate % i) == 0)
               return false;
            }
            return true;
             }
        }

  6. Önce While  daha sonra da IfElse aktiviteleri için koşullar eklenir. Bunun için aşağıdaki şekildeki gibi Properties(Özellikler) menüsünden ConditionName(Koşul ismi) 'in sağ tarafındaki "üç nokta"ya tıklanır.




  7. Çıkan pencerede New Condition(Yeni koşul) denilerek içine koşulu yazılır ve OK(Tamam)'a basılır. Diğer IfElse aktiviteleri için de tek tek aynı işlem yapılır. While koşulunun içine "this.sayi != 21" eklenmesiyle yapacağımız işlem 21 sayısına kadar devam edecek demektir.




  8. Diğer IfElse aktivitelerinin içerisine de sayıların asal olup olmamasına göre yazılan "AsalSayi" sınıfı da kullanılarak sonuç true(doğru) veya false(yanlış) olarak döndürülür. Döndürülen sonuca göre de yapılacak işe karar verilir. Buna karar veren yapı iş akışının kendisidir. İlk If yapısının içine "AsalSayi.asalMi(sayi) == true" ve ikincisinin de içine "AsalSayi.asalMi(sayi) == false" eklenerek koşul kısmı oluşturulmuş olur.


  9. Diyagramın içindeki Code Activity(Kod aktiviteleri)'lere çift tıklanarak sahip oldukları metodlar aktifleştirilmiş olur ve artık içlerine kod yazılabilir.

    public void codeActivity1_ExecuteCode(object sender,EventArgs e)
    {
       bool asal = AsalSayi.asalMi(sayi);
    }

    private void codeActivity2_ExecuteCode(object sender, EventArgs e)
    {
       Console.WriteLine(Convert.ToString(sayi) + " sayısı asaldır.");
       sayi++;
    }

    private void codeActivity3_ExecuteCode(object sender, EventArgs e)
    {
       Console.WriteLine(Convert.ToString(sayi) + " sayısı asal değildir.");
       sayi++;

    }


  10. Biten uygulamada en son ortaya çıkan XAML kodları aşağıdaki gibidir. İstenildiği gibi bir koşul veya aktivite eklenip çıkarılmaya hazırdır.

    <SequentialWorkflowActivity
    x:Class="WorkflowConsoleApplication1.Workflow1"
    x:Name="Workflow1"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
    <CodeActivity x:Name="codeActivity1" ExecuteCode="codeActivity1_ExecuteCode" />
    <WhileActivity x:Name="whileActivity1">
       <WhileActivity.Condition>
          <RuleConditionReference ConditionName="Condition1" />
       </WhileActivity.Condition>
    <IfElseActivity x:Name="ifElseActivity1">
       <IfElseBranchActivity x:Name="ifElseBranchActivity1">
          <IfElseBranchActivity.Condition>
             <RuleConditionReference ConditionName="Condition2" />
          </IfElseBranchActivity.Condition>
    <CodeActivity x:Name="codeActivity2" ExecuteCode="codeActivity2_ExecuteCode" />
       </IfElseBranchActivity>
       <IfElseBranchActivity x:Name="ifElseBranchActivity2">
          <IfElseBranchActivity.Condition>
             <RuleConditionReference ConditionName="Condition3" />
          </IfElseBranchActivity.Condition>
    <CodeActivity x:Name="codeActivity3" ExecuteCode="codeActivity3_ExecuteCode" />
          </IfElseBranchActivity>
    </IfElseActivity>
    </WhileActivity>
    </SequentialWorkflowActivity>

  11. 20'ye kadar olan asal sayıları gösteren uygulama kullanılmaya hazırdır. Ctrl + F5 'e basılarak çalıştırılır.