Makale Özeti

Makalemiz de daha çok yeni zihinlerimizi kurcalamaya başlayan bu teknoloji hakkında sizleri bilgilendirmeye çalışacam . Bu makalelik iş süreçlerinin tiplerinden ve workflow ile ilgili en basit kavramlardan bahsediyor olacam ve bir Hello World uygulaması ile WWF’ye giriş yapacaz . İlerleyen makalelerimde de sizleri mimarisi ve aktiviteler hakkında bilgilendirmeyi amaçlıyorum .

Makale

Windows Workflow Foundation – Bebek adımları

 

            Windows Workflow Foundation (WWF) daha önceden Microsoft’un WinFX diye lansmanını yaptığı , sonradan .Net 3.0 diye anlandırdığı platform ile gelen teknolojilerden biridir . Adı üzerinde ,esas faaliyet alanı da iş süreçleridir .

            Makalemiz de daha çok yeni zihinlerimizi kurcalamaya başlayan bu teknoloji hakkında sizleri bilgilendirmeye çalışacam . Bu makalelik iş süreçlerinin tiplerinden ve workflow ile ilgili en basit kavramlardan bahsediyor olacam ve bir Hello World uygulaması ile WWF’ye giriş yapacaz . İlerleyen makalelerimde de sizleri mimarisi ve aktiviteler hakkında bilgilendirmeyi amaçlıyorum .

İlk olarak,bir iş süreci nedir diye kendimize sorabiliriz ? En basit anlamda iş süreci dökümanların ve/veya  görevlerin  bir iş prosesi boyuncu hareketleridir .

Yazılım geliştiriciler olarak da iş hayatına atıldığımız vakit ,genellikle kendimizi iş süreçleri için uygulamalar geliştirirken buluyor olacaz. En bilindik iş süreçlerinden biri  de “Onay Süreci”’dir . Misal olması açısından : Bir birey  bir işlemi gerçekleştirir ve bu işlem genellikle kendinden daha kıdemli bir birey  tarafından (veya yetkili bir birey tarafından ) onaylanarak faaliyete geçer . Burada bir  bilgi akışı olduğunu görebiliriz . Akışı başlatan birey esasında işlemi gerçekleştirerek bir olaya sebep olmuş ve yetkili birey de bu olay tarafından uyarılarak belki iş kuralları çerçevesinde ,belki de kendi ussal kararları çerçevesinde bu işleme onay veya red veriyor olacaktır . Hemen aklınıza bir otomasyon  geliştiricisi olarak “Eğer iş kuralları varsa zaten , yetkili bireyin bireysel kararın ne gerek var?” gibi bir soru takılabileceğini farzedelim . Evet tam üzerine bastınız  : WWF kurallarımızı da yönetebiliyor . İster beşeri müdahale gerektiriyor olsun , ister otomatik bir devamlılık arz ediyorsun veya isterse de belli olaylara tabi olsun ;WWF bu senaryoların hepsini yönetebilmektedir  .

WWF bize bu akışlar ve geçişleri tasarlayabileceğimiz görsel bir arayüz sunuyor(tabii ki kod da yazıyoruz) . Esasında WWF’ı bir arabanın motoruna da benzetebiliriz . Motor arabanın içinde yer almıyorsa bir işlev görmez ama tekrar kullanılabilir bir yapıdadır  ; yani herhangi  bir arabaya da monte edilip işlev sahibi yapılabilir (tabiiki aynı model arabamız:) .    WWF da kendi başına bir anlam ifade etmez , bir uygulama içinde mutlaka host edilmesi gerekmektedir . Bu bir Windows Forms ,ASP.NET,Web Servisi uygulaması olabileceği gibi en basitinden bir Console uygulaması da olabilir . Ama host eden uygulama bir zorunluluktur . WWF örneğimizdeki benzetmede olduğu gibi bir motordur .

 

            Bir WWF projesi oluşturmamız için gerekli olanlar :

  • .NET 3.0 runtime bileşenleri
  • WWF Visual Studio Extension’ları . (Esasında WWF kendi tasarım araçlarımızı da yaratabileceğimiz bir alt yapı sunmakta ;fakat çoğumuz VS’i tek geçiyor olacağız heralde)

 

Bunların hepsini MSDN’den ücretsiz olarak indirebilmekteyiz . Yüklemelerimiz bittikten sonra ;Visual Studio’yu açıp , yeni proje eklemek üzere ilgili ekranı açarsak C# ve Visual Basic düğümlerinin altında bir Workflow düğümü eklenmiş olduğunu hemen fark ediyor olacağız . İçerisinde 6 adet yeni şablonumuz yer almakta :

 

 

Sequential Worfklow Console Application : Bir workflow projesini varsayılan olarak gelen bir  Sequential Workflow ile birlikte console uygulaması olarak yaratır .

Sequential Workflow Library : : Bir workflow projesini varsayılan olarak gelen bir  Sequential Workflow ile birlikte kütüphane olarak yaratır.

Workflow Activity Library : Workflow’larda kullanacağımız aktiviteleri ekleyebileceğimiz bir kütüphane şablonudur .

State Machine Worfklow Console Application :  Bir workflow projesini varsayılan olarak gelen bir  State Machine Workflow ile birlikte console uygulaması olarak yaratır .

State Machine Workflow Library :  Bir workflow projesini varsayılan olarak gelen bir  State Machine Workflow ile birlikte kütüphane olarak yaratır .

Empty Workflow Project :  Herhangi varsayılan bir sınıf eklemeden boş bir kütüphane projesi yaratır (Favorim!!!) .

            Şablonlara baktığımızda aktivite , sequential workflow ve state machine workflow kavramları dikkatimizi çekiyor . Sonda söyleyeceğimi , başta söyleyim  : Herşey bir aktivitedir !

            Aktivite kavramına değinmeden önce sequential ve state machine workflow kavramlarından bahsetmek daha anlaşılır olacaktır . Bunlar iki temel workflow kalıbımızdır .

 

Sequential Workflow :  Sürekli tekrar eden , tahmin edilebilir,aktiviteleri daha önceden değişmeyecek şekilde kesin bir şekilde sıralanmış  iş süreçlerimiz için ideal olanıdır . Belirli bir sırada dizilen aktiviteler çeşit kurallar ve olaylarla dallanarak  yukarıdan aşağı doğru bir akış izler. 

           

 

State Machine Workflow : State’lerden oluşur . Bir state başlangıcı bir state de bitişi temsil eder.  Sequential Workflow’dan daha esnek bir yapıya sahiptir . Aktivitelerin sıralı bir şekilde işleyiş gösterdiği  Sequential Workflow’un aksine ,State Machine aktiviteleri dış  olaylara dayalı bir şekilde işleyiş gösterirler  . Bir olayin meydana gelmesiyle state’ler arası geçiş gerçekleşir . Son bitiş state’ine geçiş yapıldığı vakit , workflow tamamlanmış olur .

 

 

 

 

Bu kadarlık bir giriş yaptıktan sonra bence beraber bir Hello World uygulaması geliştirebiliriz ve bu arada da bazı detaylara deyinme imkanımız da olacaktır . İlk olarak bir Sequential Worfklow Console Application projesi açalım ve adına WWF.HelloWorld diyelim ve varsayılan olarak gelen Worflow1.cs dosyasının adını HelloWorldOrnegi olarak değiştirelim ;böylelikle ilk uygulamamızı geliştirmeye hazırız .

 

Soldaki Toolbox’da VS Extensions ile gelen hazır aktivite kütüphanemizi göreceksiniz  , zengin bir içeriğe sahip olsada bu kütüphanenin yetmediği durumlar olacaktır . WWF’da kendi aktivitelerimizi yazma imkanımızda var . Bunu ayrı bir makale olarak yazmayı arzu ediyorum ileride . Şimdilik kulak dolgunluğumuz olsun yeter .

Ayrıca projemiz içerisinde yer alan Program.cs dosyasının içindeki kodlara da dikkatinizi çekmek isterim .  Temel olarak bir workflow’un ayağa kaldırılması için gerekli minumum kodu içerir .

Açıklamak istediğim diğer bir husus ise , bir workflow’u projemize eklerkenki ayrım . Projemize sağ tıklayıp , Ad > New Item ekranını açtığımız vakit karşımıza ,workflow tiplerimize ait şablonlardan 2’şer tane olduğunu göreceksiniz . Bunlar “code” ve “with code seperation”  detayları ile birbirinden ayrılmıştır .

“code” olanı seçersek ,projemize aynı bir Windows Form eklediğimizdeki gibi bizim üzerinde değişiklikleri yapmamız için  “.cs” dosyası ,hemen altında da   designer tarafından üretilen kodun bir partial class olarak  eklendiği “.Designer.cs” dosyası beraber eklenir . Visual Studio’nun varsayılan modeli  her zaman “code” seçeneğidir (Örneğimizdeki gibi).

Diğer taraftan “with code seperation” detayıyla seçersek , projemize bir “.xoml” uzantılı bir dosya eklendiğini görürüz . XOML(Extensible Object Markup Language) WWF nesneleri için bir serileştirme formatıdır . Şema XAML ile aynı olmakla beraber XOML sadece dosya uzantısı olarak kullanılır . Bu şekilde deklaratif olarak oluşturulan dosyalar sonradan runtime yüklenebilmektedir . “.xoml” uzantılı dosyanın altında yine kendi kodlarımızı eklemek için bir “.xoml.cs” uzantılı dosya olduğu gözümüze çarpmakta .

Designer ekranında sağ tıklayıp “View Code” dedikten sonra , sınıfın SequentialWorkflowActivity sınıfından türediğini görebiliriz . Bunu istersek StateMachineWorkflowActivity olarak da değiştirebiliriz , böylelikle bir state machine yazmaya da geçiş yapabiliriz  .  Türedikleri sınıfın adının sonundaki Activity sözcüğünden (herşey bir aktvitedir!) de anlaşılacağı gibi,en temelde bu sınıfların System.Workflow.ComponentModel.Activity sınıfından türediğine object browser’ı kullanarak bakabilirsiniz . Bu sınıftan türetme yaparak ,kendi aktivitelerimizi de oluşturabiliriz .

Örneğimizde workflow’a şu anki zamanı parametre olarak yollayıp , günün saatine göre ekranda günaydın ,tünaydın ve iyi akşamlar gibi mesajlar gösterecez ;bu şekilde parametreleri,”code activity”’i ve “if else activity” ‘i de kullanmış oluruz .

Bir workflow’a parametre yollamak için ilk önce workflow’da parametreyi tanımlamalıyız . Bunu bir property oluşturarak kolayca gerçekleştirebiliriz (prop yazıp tab’ı tuşayarak Visual Studio’nun code snippet’ını kullanabilirsiniz) .

 

  private DateTime _saat;

 

        public DateTime Saat

        {

            get { return _saat; }

            set { _saat = value; }

  }

           

            Sıra geldi aktivitelerimizi belirlemeye. İlk önce designer ekranını açtıktan sonra , toolbox’tan “Drag Activities to create  a Sequential Workflow”           yazan yere IfElse aktivitesinden sürekleyerek bırakalım . Adı pek çoğumuzun içini ısıtacak , gurbette bir tanıdığı görmüş hissi yaratacak olan bu aktivitemiz belirlediğimiz koşullara göre paralel olarak ayrılmış bloklardan birini işletecektir . Şartı kontrol ederken soldan sağa doğru bir ilerleme söz konusudur .  İlk eklememizde 2 tane paralel blok var ,bize ise 3 tane lazım  . Aktivitenin üzerine sağ tıklayıp “Add Branch” diyerek bu sayımızı bir arttırabiliriz  . Burada  her bir paralele  bir şart atayarak ,işleyişin hangi blok üzerinden devam edeceğini belirlemeliyiz . Dallanan bloklardan ilkini seçip  property penceresini açtığımız zaman Name ve Condition özelliklerini görüyor olmamız lazım . Name olarak “sabahsa” yazalım ve Condition özelliğini çoktan seçmeli olarak “Code Condition” belirleyelim .Hemen yanında beliren artı işaretini tıkayıp düğümü açtıktan sonra altında yine  aynı isimle beliren  yerin değerine bize şartımızın  karşılanıp karşılanmadığını belirleyecek olan metodun adını yazalım  ve enter tuşuna basalım . Kendimizi kod sayfasında buluyor olacaz . Çoğumuzun aklında ilk beliren şekilde metod  “bool” dönüş tipine sahip değil ,bunun yerine şartımızı olay argümanları içerisinde yer alan “bool” tipindeki “Result” özelliğini set ederek onaylayacaz veya reddecez . Varsayilan olarak zaten “false” kabul edilir .

 

  private void Sabahsa_Evaluate(object sender, ConditionalEventArgs e)

  {

      if (6 <= _saat.Hour && _saat.Hour < 12)

      {

          e.Result = true;

      }

  }

 

            Çoğunuzun “Condition” özelliğini “Code Condition” olarak belirlerken orda bir de “Declarative Rule Condition”seçeneği olduğunun farkına varacaksınız . Bu seçeneği seçersek  , bu seçenek bize tekrar kullanılabilir şartlar yaratacaktır .  Seçip , altında yer alan ConditionName özelliğinin yanındaki elipslere tıklayarak ,biraz kendiniz karıştırısanız ,nasıl kullanıldığını kolayca  bulabileceğinize eminim . Ayrıca solution explorer’ı açınca HelloWorldOrnegi.cs dosyamızın altında “.rules” uzantılı bir dosya görebilirsiniz (Tabi bir şart eklemişseniz önceden). Deklaratif olması ,ifadelerimizi bu dosya içerisinde barındırılıyor olmasından kaynaklanır .

            Diğer dallanmaları da aynı şekilde tamamlarsak ,sıra geldi bu bloklar içinde esas işletilecek aktiviteleri eklemeye . Designer ekranında yine toolbox’ımızdan bir Code aktivisini sürekleyip IfElse bloklarından en soldakinde “Drop Activities Here” yazan yere bırakalım . Code aktivitesi en basit anlamda ,yazdığımız kodları işleten bir ativitedir . Özelliklerinden adını “gunaydınDe” olarak değiştirelim ve üzerine çift tıklayalım (Özelliklerinden ExecuteCode’dan hazir metod seçebilir veya yeni bir isim belirleyip enter tuşuna basarak tamamen yeni bir metod oluşturabilirdik gene)  :

       private void gunaydinDe_ExecuteCode(object sender, EventArgs e)

        {

            Console.WriteLine("Günaydın!");

        }

 

            Bunları diğer dallanmalar için de tekrar edecek olursak ,son olarak ekranımız şu şekilde gözüküyor olacaktır.

 

Program classına’da şu şekilde bir ek yaptıktan sonra ilk Hello World uygulamamız hazır demektir .

//Parametreler bu şekilde tanımlanıyor . Key olarak property adını veriyoruz .

Dictionary<string, object> parametreler = new Dictionary<string, object>();

                parametreler.Add("Saat", DateTime.Now);

 

                //Workflow instance'ına parametreler burada geçiliyor .

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WWF.HelloWorld.HelloWorldOrnegi),parametreler);

                instance.Start();

İletişim için : kutlu.arasli@netron.com.tr

 

Referans : MSDN

 

 

 

 

 

 

 

 

 

Kodlar