Merhaba Arkadaşlar ,bu bölümde akitivite ismindeki inşa blokları setini kullanarak süreçleri nasıl tanımlayabileceğimiz ve çalıştırabileceğimiz bir modeli sağlayan Window Workflow ‘u (WWF) genel olarak inceleyeceğiz.Bu bölümde birkaç workflow tipini inceleyip,WF de bulunan yerleşik Aktivitelerin birkaçına değineceğiz.Ayrıca Standart aktivite tiplerinin bazılarının nasıl kullanıldığı görüp,WF ‘yi genişletmek için iki özel aktivite oluşturacağız.
“MERHABA DÜNYA” Örneği ;
Öncelikle VS2008 ‘de şekilde gösterildiği gibi yeni bir Sequential Workflow Console Appilication ‘nı ( workflow runtime ‘ı host edecek bir konsol uygulaması oluşturacaktır.) ve daha sonra aktivitelerin üzerine sürükleyip bırakabileceğimiz bir varsayılan workflow’u seçelim.
Daha sonra toolbox’dan şekildeki gibi bir code aktivity ‘yi tasarım yüzeyine bırakalım.
Aktivitenin sağ üst köşesinde ünlem simgesi,bu aktivite için zorunlu olan değeri atanmamış anlamındadır.Yani ExecuteCode property tanımlanmamıştır.Bu özellik aktivite çalıştırıldığında çağrılacak metodu gösterir.Aktiviteye çift tıklayalım ve oluşan metoda ilk örneği yazalım.
Program çalıştırıldığında,bir WorkflowRuntime property’si oluşur ve daha sonra workflow’un bir kopyası yapılandırılır ve çalıştırılır.
ACTIVITY
Bir workflow içinde her şey aktivitedir.Bu tanım workflowun kendisi içinde geçerlidir,workflow kendisi için diğer aktivitelerin tanımlanmasına izin veren özel bir aktivite tipidir.
Aktiviteler Aktivite sınıfından türeyen sınıflardır.Aktivite sınıfı ezilebilir birkaç metodu tanımlar ve muhtemelen en önemlisi aşağıda kod parçasında gösterilen Execute metodudur;
IfElse Activity
Bu aktivite tıpkı ,C# içindeki If-Else ifadesi gibi çalışır.Aşağıdaki gibi tasarım yüzeyine bırakıldığında iki daldan meydana gelen kompozit bir aktivitedir.Her dal (Brunch) SequenceActivity sınıfından türeyen bir kompozit aktivitedir.Bu sınıf her aktiviteyi yukardan aşağıya doğru çalıştırır.
ParallelAcitvity
Bu aktivite parelel olarak( veya sözde paralel olarak) çalışan bir aktivite setini tanımlamamıza izin verir.Şekildeki gibi bir ParallelActivity ‘ye sahip olduğumuzu düşünürsek,bu sequenceActivity1 ve sequenceActivity2 ‘nin çalıştırılmasını zamanlayacaktır. sequenceActivity tipi runtime ile birinci aktivitenin çalıştırılmasını zamanlar ve bu aktivite tamalandığında 2. Aktiviteyi zamanlar.
CallExternalMethodActivity
Bir workflow ‘un genellikle workflow dışındaki metotları çağırmasında kullanılır ve bu aktivite bir arayüz ve arayüz üzerinden çağrılacak bir metot tanımlamanızı sağlar.
DelayActivity
Örneğin workflow’unuz masraf talebinizi onaylanması için yöneticiye gönderir,daha sonra onay gelmesi veya gelmemesi halinde masraf talebinizi komuta zincirinde gerekli adıma atayabilirsiniz.
DelayActivity bu senaryonun bir bölümünü oluşturabilir. DelayActivity ‘nın amacı workflow’un çalışmasını devam ettirmeden bir süre bekletmektir. Bunu yapmak için InitializeTimeoutDuration özelliği için bir değer tanımlamamız gerekir.Aşağıdaki örnekte bu tanımlama yapılmıştır.
ListenActivity
Genel bir programlama yapısı,muhtemel olaylardan biri için beklemektir.ListenActivity ,bunu bir workflow içinde gerçekleştirmenin yoludur.
Bir ListenActivity çalıştırıldığında,her dal içindeki ilk aktivitenin üzerinde bir beklemeyi queue ‘ye alır ve bir olay başlatıldığında ,beklemedeki tüm olaylar iptal edilir olayın çıkarıldığı dal geri kalanı işler.
Özel Activity’ler
Şuana kadar Systen.WorkFlow.Activities namespace içinde tanımlanmış aktivitelerin bir kaçını inceledik.Bu kısımda özel aktivitelerin nasıl oluşturulacağını ve hem tasarım hemde çalışma zamanında iyi bir kullanıcı deneyimi sağlamak üzere bu aktiviteleri nasıl genişletebileceğimizi öğreneceğiz.
Başlamak için konsola çıktı yazdırmak üzere basitakitivite isimli bir aktivite oluşturalım.Özel aktiviteleri oluştururken bir workflow içinde bir sınıf yapılandırırsınız.Özel aktivitemizi oluşturmak için özel bir sınıf kütüphanesi yapalım ve bu sınıfı Activity base sınıfından türetelim.
Evet Arkadaşlar resimlerde görüldüğü gibi kendimize özel bir aktivite hazırladık ve bunu tasarımımıza dahil ettik.Tam anlamıyla kullanılabilir durumdadır ama yinede ActivityValidator sınıfından türetilen bir sınıf oluşturup bu sınıfı aktivitemizle ilişkilendirmeliyiz.
using System;
using System.Workflow.ComponentModel.Compiler;
namespace WorkflowConsoleApplication1
{
public class basitaktivite : ActivityValidator
{
public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
{
if (null==manager)
{
throw new ArgumentNullException("manager");
}
if (null==obj)
{
throw new ArgumentNullException("obj");
}
ValidationErrorCollection error = base.Validate(manager, obj);
basitaktivite act = obj as basitaktivite;
if (null==act)
{
if (null!=act.Parent)
{
if(string.IsNullOrEmpty(act.Message))
error.Add(ValidationError.GetNotSetValidationError("Message"));
}}
return error;
}
}
}
}
Son olarak geçerlilik kontrolünü desteğini aktivitemize eklemek gerekir.Buda aktiviteyi yazmış olduğumuz sınıfa ActivityValidation attribute’nin eklemektir.
using System;
using System.ComponentModel;
using System.Workflow.ComponentModel;
namespace WorkflowConsoleApplication1
{
[ActivityValidator(typeof(basitaktiviti))]
public class basitaktivite : Activity
{
.
.
.
;
Bu şekilde tam anlamıyla özel bir aktivite oluşturduk.Sonuç olarak bu yazıda WF genel yapısı ,merhaba dünya örneği ,aktivitelerin bazıları ile ilgili örneklere, özel aktivite oluşturma ve geçerlilik kontrolü hakkında bilgi sahibi olduk.