Workflow Hosting - 2 Workflow Hosting yazı dizimin 2. bölümünde kendi workflow host kütüphanenizi oluşturmanızı sağlayacağım. Birinci bölümde basit bir uygulama ve bu uygulamayı host edecek bir uygulama yapmıştım. Host uygulamasının çalışma şeklini inceleyerek dezavantajları ortaya koymuştum. İkinci bölümde ise bu dez avantajları tamamen ortadan kaldıran bir yöntemi sizlerle paylaşacağım. Geliştireceğimiz Kütüphaneye Genel Bakış Bu yazımda anlatacağım kütüphane yapısı, Bruce Bukovics’in workflow uygulamalarını host etme yaklaşımıdır. Windows Workflow Foundation ile ilgili kitapları karıştırırken bu yaklaşımı gördüm ve sizlerin de kendi uygulamalarınızı geliştirirken bu kütüphaneyi kullanmanızı tavsiye ederim. Kütüphane 3 sınıftan oluşuyor. 1- WorkflowInstanceWrapper: Her instance’ı WorkflowRuntime içerisinde izole eden sınıftır. Böylelikle Aynı WorkflowRuntime içerisinde farklı parameterelerle çalışabilen farklı workflowlar host edebileceğiz. Aşağıdaki diyagram WorkflowInstanceWrapper sınıfına aittir. 2- WorkflowLogEventArgs: WorkflowRuntime içerisinde bulunan WorkflowInstance larının ve WorkflowRuntime’ın durumlarını loglarken fırlatacağımız olay için gerekli bir sınıf. 3- WorkflowRuntimeManager: Yapı içerisindeki en önemi sınıf olan WorkflowRuntimeManager’ı, içerisinde bulundurduğu WorkflowInstanceWrapper nesnelerini yönetmek için kullanacağız. Kütüphanemizi Geliştirmeye Başlayalım Kütüphanemizi geliştirmek için ilk yapmanız gereken bir tane Empty Workflow Project Başlatmak. Ben Projenin Adına “Cagdas.Workflow.Hosting” ismini verdim. WorkflowInstaceWrapper Sınıfını Tanımlayalım 1- Başlattığınız Empty Workflow projesine WorkflowInstanceWrapper adında bir sınıf ekleyin. 2- WorkflowInstanceWrapper sınıfına Seializable attribute’unu ekleyin. Bu attribute ekleyerek ilerleyen aşamalarda workflow’unuzu serialize etme fırsatı bulacaksınız. 3- WorkflowInstanceWrapper.cs uzantılı dosyaya System.Workflow.Runtime, System.Workflow.Runtime.Hosting ve System.Threading isim alanlarını ekleyin. 4- Sınıfın fieldlarını tanımlayın. __workflowInstance field’ı, WorkflowInstanceWrapper sınıfının izole edeceği WorkflowInstance’tır. WorkflowInstanceWapper sınıfı kullanılırken arka planda WorkflowInstance nesnesini kullanacak. __waitHandle field’ı ise WokrflowInstanceWrapper nesnesinin işi bittiğinde Workflow Runtime Engine ile haberleşmesi için kullanacağız. __outputParameter field’ını workflow’un döndüreceği parametreleri tutmak için kullanacağız. Workflow çalışırken hata oluştuğunda, hatayı Workflow Runtime Engine’e bildirmek için __exception field’ını kullanacağız. Herhangi bir nedenden dolayı workflow’un çalışması durdurulursa, durdurulma nedenini __reasonSuspended fied’ı aracılığıyla Workflow Runtime Engine’e bildireceğiz. 5- Sınıfın contructor’ını yazın. Contructor’da dışarıdan aldığımız WorkflowInstance tipindeki parametreyi izlode edeceğiz. WorkflowInstanceWrapper sınıfı kendi içerisinde direkt olarak bir WorkflowInstance oluşturmuyor, dışarıdan aldığı parametreyi izole ediyor. 6- Exception özelliğini tanımlayın. 7- Id özelliğini tanımlayın. Kullanacağımız WorkflowInstance’ın InstanceId’sini verir. Bu özelliklik birden fazla WokflowInsantance nesnesinin aynı ortamda bulunduğu noktalarda işe yarayacaktır. 8- OutputParameters özelliğini tanımlayın. WorkflowInstance’a ait çıktı parametrelerine erişeceğimiz özellik. 9- ReasonSuspended özelliğini tanımlayın. 10- WaitHandle özelliğini tanımlayın. 11- StopWaiting metodunu tanımlayın. StopWaiting metodu WorkflowInstace’ın çalışmasını tamamladığını Workflow Runtime Engine’e haber vermek için kullanacağız. WorkflowLogEventArgs Sınıfını Tanımlayalım 1- Projenize WorkflowLogEventArgs adında bir sınıf ekleyin. 2- Message adında ve string tipinde bir özellik tanımlayın. 3- Sınıfa ait bit tane constructor tanımlayın. WorkflowRuntimeManager Sınıfını Tanımlayalım
Uygulamanıza System.Configuration referansını ekleyiniz. Daha sonra WorkflowTest sınıfına gelin ve Run metodunun başında aşağıdaki değişiklikleri yapın. Burada AddServices metodunu yorum haline getirdik. Ayrıca new WorkflowRuntime(“WorkflowRuntime”) bölümünde ayarların App.Config dosyasından alınmasını sağladık. Böylelikle ayarlarda değişiklik yaptığımızda kodu tekrar derlememize gerek kalmayacak. Yani bize esneklik kazandıran bir işlem yapmış olduk. Uygulamayı tekrar çalıştırdığınızda problemsiz bir şekilde çalıştığını göreceksiniz. Özet