Makale Özeti

İki bölümden oluşacak Workflow Hosting makalelerimden ilki olan bu bölümde sizlere geliştirdiğiniz iş akışlarını basit bir şekilde host etmeyi anlatacağım. Bu bölümde kendi workflow hosting mekanizmanızı oluşturmaya giriş yapmış olacak ve workflow hosting ile ilgili avantaj ve dezavantajları görmüş olacaksınız.

Makale

Workflow Hosting - 1

 

İki bölümden oluşacak Workflow Hosting makalelerimden ilki olan bu bölümde sizlere geliştirdiğiniz iş akışlarını basit bir şekilde host etmeyi anlatacağım. Bu bölümde kendi workflow hosting mekanizmanızı oluşturmaya giriş yapmış olacak ve workflow hosting ile ilgili avantaj ve dezavantajları görmüş olacaksınız.

 

Neden Kendi Hosting Mekanizmamızı Geliştirmeye İhtiyaç Duyarız?

 

Visual Studio 2008 içerisinde geliştirdiğiniz Sequential Workflow Console Application ya da State Machine Workflow Console Application ile gelen default hosting mekanizmasını Program.cs içerisinde buluyorsunuz. Program.cs içerisindeki default hosting mekanizmasını kullanarak workflow uygulaması geliştirmezsiniz. Bu mekanizmanın limitleri sınırlıdır. Eğer gerçek anlamda workflow uygulaması geliştirmek istiyorsanız kendi hosting mekanizmanızı geliştirmeniz gerekmektedir.

 

 

Hosting Mekanizmasına Genel Bakış

 

Aşağıda workflow hosting mekanizmasının sorumlulukları yer almaktadır:

 

  • Workflow Runtime Engine’inin örneğini oluşturmak ve başlatmak. Bunu WorkflowRuntime sınıfı ile yaparız.
  • Workflow Runtime Engine tarafından tanımlanmış olaylara abone olmak ve bu olaylar gerçekleştiğinde etkileşim oluşturmak.
  • Runtime Engine ile Core Workflow Service olarak geçen servislerin örneğini oluşturmak ve bu servislere kayıt olmak. Bu işlem opsiyoneldir. Bu servisler workflow kalıcılığı(workflow persistance), thread planlaması(thread scheduling), transaction yönetimi(transaction management) ve workflow izlemesidir(workflow tracking).
  • Runtime Engine ile Local Service olarak geçen servislerin örneğini oluşturmak ve bu servislere kayıt olmak. Bu işlem opsiyoneldir. Local servisler öncelikli olarak çalışan workflow uygulaması ile host uygulaması arasındaki iletişimi sağlarlar.
  • Workflow Runtime Engine’i kullanarak workflow’un örneğini oluşturmak.
  • Devam eden bütün workflowlar işlerini tamamlayana kadar çalıştırma işlemini devam ettirmek.
  • Workflowları sıralı bir şekilde sonlandırmak.

 

 

Basit Basit Bir Workflow Uygulaması Geliştirelim

 

Amacımız workflowları host etmek olduğundan basit bir workflow uygulaması geliştireceğiz. Bu uygulama içerisinde iki tane DependencyProperty buluncak. Birincisi Girdi adında ve string tipinde olacak. İkincisi ise Cikti adında ve string tipinde olacak. Workflow içerisinde bir tane Code aktivitesi olacak. Code aktivitesinin ExecuteCode özelliği Calis değerini tutacak.

 

  1. Bir tane Sequential Workflow Console Application projesi başlatın.
  2. Program.cs dosyasını silin.
  3. Workflow1’e ve bir tane Code aktivitesi sürükletip bırakın. Code aktivitesinin ExecuteCode özelliğine Calistir yazın.
  4. Workflow1’in kod bölümüne geçin ve yukarıda belirttiğim iki DependencyProperty değerlerini tanımlayın.

 

 

 

  1. Calistir metodu içerisine aşağıdaki kodları yazın.

 

 

Calistir metodu içerisinde çalışan workflow’un instanceId’sini yazdırdık. Workflow’un InstanceId’si Guid tipinde olur.

 

  1. Yukarıdaki 5 adımı tamamladığınızda basit workflow uygulamanızı bitirmiş olacaksınız.

 

 

Host Uygulaması Geliştirelim

 

Yukarıda geliştirmiş olduğunuz workflow’u host ederken öncelikle yapmanız gereken şey, projeniz içerisine Program adında bir sınıf eklemeniz. Geliştireceğimiz Program sınıfının class diyagramını aşağıdaki resimde görebilirsiniz.

 

 

  1. Program sınıfının fieldlarını tanımlayın.

 

 

  1. Result özelliğini tanımlayın.

 

 

  1. InitializeWorkflowRuntime metodunu tanımlayın.

 

 

Bu metot WorkflowRuntime sınıfından bir örnek oluşturur ve bu örneğin WorkflowCompleted ve WorkflowTerminated olaylarına abone olur.

 

  1. WorkflowRuntime’ın WorkflowTerminated olayı tetiklendiğinde çalışacak _workflowRuntime_WorkflowTerminated metodunu yazalım.

 

 

  1. WorkflowRuntime’ın WorkflowCompleted olayı tetiklendiğinde çalışacak _workflowRuntime_WorkflowCompleted metodunu yazalım.

 

 

  1. Program sınıfına bir tane constructor ekleyin ve içerisinde InitializeWorkflowRuntime metodunu çağırın.

 

 

  1. Program sınıfına IDisposable interface’ini implement ettirin.

 

 

  1. IDisposable interface’ini implement ettiğinizde gelen Dispose metodu içerisinde aşağıdaki kodları yazın.

 

 

  1. Workflow’u çalıştırmaya yarayacak olan RunWorkflow metodunu çalıştırın.

 

 

  1. Bu aşamaya kadar Program sınıfını tanımlamış olduk. Uygulamamızı test edebilmemiz içim bir tane Main metoduna ihtiyacımız olacak. Bu yüzden Program sınıfının içerisinde bir tane Main metodu ekleyin ve aşağıdaki kodu Main metodunun içerisine yazın.

 

 

Yukarıdaki kodlar Workflow1 tipinde üç farklı instance oluşturur ve bunları “Girdi” özelliğine atanan değerlerle çalıştırır. Çalıştırdığı her instance sonucunda, dönen “Cikti” özelliğini ekrana yazdırır.

 

Uygulamayı çalıştırdığınızda aşağıdaki çıktıyı alacaksınız.

 

 

 

Geliştirdiğimiz Host Uygulamasını Değerlendirelim

 

Geliştirdiğimiz bu kodu düşünün. Nerdeyse .net içerisindeki herhangi bir Workflow Console uygulamasının yaptığı host işleminin aynısını yapıyor. Peki, bu host uygulaması geliştireceğimiz uygulamalar için bize esneklik sağlıyor mu? Yazdığımız kodun tekrar kullanılabilirliği var mıdır?

 

Profesyonel anlamda WWF ile kod geliştirmek istiyorsanız bu sorulara cevap verebiliyor olmalısınız. Aşadaki maddeler hos uygulamasının neleri yapıp neleri yapamayacağını açıklıyor.

 

  1. WorkflowRuntime ve WorkflowInstance nesnelerinin yönetimi Program sınıfı içerisinde yapıldığı için tekrar kullanılabilirliği yoktur. Bu da uygulamalarımızı geliştirmemiz için bizlere doğru bir yol sunmaz.
  2. Geliştirilen host uygulaması sadece aynı anda tek bir workflow’u yönetmek için tasarlanmış. Bu yüzden tekbir workflow’un bitmesi beklenmektedir. Bir workflow’un çalışmaya başlamadan önce kendinden önceki workflow’un işini bitirmesini beklemesi gerekmekte.
  3. Birden fazla workflow instance’ı olduğu durumlarda, her workflow için output parametresi yönetimi yapılmamaktadır. Sadece tek bir değişken üzerinde bir sürü workflow çıktısını yönetmek durumunda kalınmaktadır.
  4. Output parametresi(Cikti) hard-coded olarak tanımlandığı için sadece aynı tipteki workflowları host edebileceği anlamına gelmektedir. Farklı output parametreleri olan workflow’lar çalıştırılamayacaktır. Çünkü bunun için tek bir özellik tanımlanmıştır(Cikti).
  5. Workflow Runtime Engine’inin sınırlı olayları yakalanmaktadır. Genelde uygulamalar içerisinde daha fazlasına ihtiyaç duyarız.

 

 

Özet

 

Bu bölümde basit bir host uygulaması yapmanın başlangıç için eğlenceli olduğunu fakat uygulama geliştirmek için yeterli olmadığını gördünüz. Geliştirdiğiniz Workflowlar nasıl host ederseniz başarılı sonuçlar alırsınız sorusunun cevabını WorkflowHosting makale serisinin ikinci bölümünde öğrenebilirsiniz.