Akış Olayları
Akıştaki her nesne çalışırken belirli anlarda bir olay (event) tetikler. Siz bu olaya bir C# işleyici (handler) yazarsanız, akış o noktaya geldiğinde kodunuz çalışır. Örneğin bir Fonksiyon düğümü çalıştığında _Execute olayı, bir Pozisyon onaylandıktan sonra _OnAfterEvent olayı tetiklenir.
İşleyiciler her zaman void döner ve (object sender, <ArgsTipi> args) imzasını taşır. Olayın türü (args tipi) hem kodunuza hangi bilgilerin geleceğini hem de kodun ne zaman çalışacağını belirler.
Ne zaman tetiklenir?
Olaylar iki gruba ayrılır:
- Çalıştırma (execution) olayları: Bir adım çalıştığında tetiklenir. En sık kullanılanı, bir Fonksiyon düğümünün kendi kod gövdesini çalıştıran
_Executeolayıdır. Bu olaylar onay bağlamı (kim, hangi aksiyon, hangi sebep) taşımaz. - Onay (event) olayları: Bir kullanıcı bir onay aksiyonu (onayla, reddet, yönlendir...) yaptığında tetiklenir.
_OnBeforeEventaksiyon işlenmeden önce,_OnAfterEventaksiyon işlendikten sonra çalışır. Bu olaylar kimin işlem yaptığını, hangi aksiyon kodunu seçtiğini ve girdiği sebep metnini taşır.
Bir Fonksiyon düğümü _Execute gövdesini her zaman çalıştırır. Ama bir adım/pozisyon/grup yalnızca, o nesne için ilgili kodlama olayını tasarımcıda açtıysanız _OnBefore / _OnAfter işleyicisini tetikler. _OnAfterEvent işleyiciniz hiç çalışmıyorsa, büyük ihtimalle olay o adımda açık değildir.
Olay işleyici imzaları
Tasarımcı, nesne adına göre işleyici metot adını üretir: <NesneAdı>_<OlayEki>. Aşağıdaki imzalar gerçek akış kodlarında doğrulanmıştır.
| İşleyici eki | args tipi | Ne zaman çalışır |
|---|---|---|
_Execute | OnExecuteEventArguments | Bir Fonksiyon (FlowScript) düğümü gövdesini çalıştırdığında |
_OnBeforeExecution | OnBeforeExecutionArguments | Bir adım çalışmadan önce (args.Cancel ile durdurulabilir) |
_OnAfterExecution | OnAfterExecutionArguments | Bir adım çalıştıktan sonra |
_OnBeforeEvent | OnBeforeEventArguments | Bir onay aksiyonu işlenmeden önce (iptal edilebilir) |
_OnAfterEvent | OnAfterEventArguments | Bir onay aksiyonu işlendikten sonra |
Olay argümanı tipleri ve üyeleri
Her args tipi şu dört temel üyeyi ortak olarak taşır: StepArguments Step, Int64 ProcessId, Boolean IsSessionStarterObject, Context Context.
OnExecuteEventArguments (Fonksiyon _Execute)
Yalnızca yukarıdaki dört temel üyeyi taşır. Onay bağlamı yoktur: EventCode, ActionerUserId ve EventFormId bulunmaz.
OnBeforeEventArguments (onay aksiyonu işlenmeden önce)
Onay aksiyonunu işlenmeden hemen önce yakalar ve veto edebilirsiniz. Üyeleri:
Int32 EventCode— kullanıcının tıkladığı aksiyonun sayısal kimliği.Int32 ResultEventCode— sonuç aksiyon kodu.Int64 ActionerUserId— işlemi yapan kullanıcının kimliği.ApproverType ActionerType— işlemin kim adına yapıldığı (None,Self,Delegated,As).Dictionary<String, String> Reason— kullanıcının girdiği sebep metni (dile göre anahtarlı).Boolean Cancel { get; set }—trueyaparsanız aksiyon işlenmeden iptal edilir.
OnAfterEventArguments (onay aksiyonu işlendikten sonra)
OnBefore ile aynı onay bağlamını taşır, ama Cancel yoktur (aksiyon zaten gerçekleşti). Buna karşılık tek bu tipte bulunan bir üye vardır:
Int32 EventFormId— aksiyon bir açılır (popup) form açtıysa, o belgenin kimliği. YalnızcaOnAfterEventArgumentsbu üyeyi sunar.- Ayrıca
EventCode,ResultEventCode,ActionerUserId,ActionerType,Reason.
OnBeforeExecutionArguments / OnAfterExecutionArguments
Bunlar yalnızca dört temel çalıştırma bağlamını taşır (Step, ProcessId, IsSessionStarterObject, Context); EventCode, Reason ya da ActionerUserId taşımaz. OnBeforeExecutionArguments ek olarak ayarlanabilir bir Boolean Cancel üyesine sahiptir.
args.Step ile hangi nesnenin tetiklediğini öğrenmeargs.Step bir StepArguments nesnesidir ve Id, Key, Name, TypeCode (bir WorkflowItemTypeCode enum'u) üyelerini taşır. args.Step.TypeCode ile olayı hangi tür nesnenin tetiklediğine göre dallanabilirsiniz.
Kod örnekleri
Onay olaylarına yazdığınız sunucu (akış) kodu turuncu çerçevelidir.
Reddetme / sebep metnini okuma
Reason dile göre anahtarlanmış bir Dictionary<String,String> olduğu için ya üzerinde dönerek ya da bilinen bir kültür anahtarıyla okuyabilirsiniz.
public void p_gorus_OnBeforeEvent(object sender, OnBeforeEventArguments args)
{
if (args.Reason.Count > 0) // sebep girilmiş mi?
{
foreach (var sebep in args.Reason)
{
if (!string.IsNullOrEmpty(sebep.Value))
{
v_gorNedeni.SetConstantValue(sebep.Value);
v_gorNedeni.IsHtml = true; // sebep metni HTML olabilir
}
}
}
}
Hangi aksiyonun yapıldığını kontrol etme (EventCode)
EventCode, kullanıcının tıkladığı aksiyonun sayısal kimliğidir. Kodlar akışa özeldir (tasarımcıda o nesnenin olay listesinde tanımlanır), o yüzden tahmin etmek yerine bir kez keşfedin.
public void g_UPM_OnAfterEvent(object sender, OnAfterEventArguments args)
{
if (args.EventCode.ToString() == "21"
&& string.IsNullOrEmpty(Document1.Controls["GORAKTAR"].Value?.ToString()))
{
throw new Exception("Görüşe aktarılacak kullanıcıyı seçiniz.");
}
}
Bir onay aksiyonu açılır form açtığında, o belgenin kimliği yalnızca OnAfterEventArguments.EventFormId üzerinden gelir. OnExecuteEventArguments bu üyeyi taşımadığı için, açılan formu bir Fonksiyon düğümünden doğrudan okuyamazsınız. Yöntem: onaylayan adımın _OnAfterEvent işleyicisinde args.EventFormId değerini bir Değişken nesnesine yazın, sonraki bir Fonksiyon düğümünde o kimlikle formu açıp okuyun.
İpuçları
- İşleyici adı nesnenin adına bağlıdır:
<nesneAdı>_<olayEki>. Nesneyi yeniden adlandırırsanız imza da değişir. - Bir aksiyonu engellemek için
OnBeforeEventiçindeargs.Cancel = true;yapın; aksiyon zaten işlendiyse (OnAfterEvent) iptal mümkün değildir. - Kim işlem yaptı (
ActionerUserId,ActionerType), hangi aksiyon (EventCode) ve sebep (Reason) bilgisine yalnızca onay olaylarından (OnBefore/OnAfterEventArguments) ulaşabilirsiniz; çalıştırma olayları (OnExecute/OnBeforeExecution) bunları taşımaz. - Loglama için
args.Contextstandart bağlam kaynağıdır:LogExtension.Log("...", args.Context);.
Doğrulanmış kod arayüzü (olay argümanları)
Ad alanı: Bimser.Synergy.Entities.Workflow.EventArguments
Temel üyeler (her tipte): StepArguments Step, Int64 ProcessId, Boolean IsSessionStarterObject, Context Context.
OnExecuteEventArguments: yalnızca temel üyeler.
OnBeforeEventArguments: EventCode (Int32), ResultEventCode (Int32), ActionerUserId (Int64), ActionerType (ApproverType), Reason (Dictionary<String,String>), Cancel (Boolean, ayarlanabilir) + temel üyeler.
OnAfterEventArguments: EventFormId (Int32, yalnızca bu tipte), EventCode, ResultEventCode, ActionerUserId, ActionerType, Reason + temel üyeler. Cancel yoktur.
OnBeforeExecutionArguments: Cancel (Boolean, ayarlanabilir) + temel üyeler. OnAfterExecutionArguments: yalnızca temel üyeler.
StepArguments (args.Step): Id (Int64), Key (String), Name (String), TypeCode (WorkflowItemTypeCode).
ApproverType enum: None, Self, Delegated, As.
args.Cancel = true ile OnBeforeExecution adımını durdurmak derlenir ancak çalışma zamanı davranışı dump'tan doğrulanmamıştır. TODO: doğrulanacak.
Kaynak: synergy-csp references/events.md ve references/flow-code-basics.md (örnekle doğrulanmış imzalar ve üyeler) + Bimser.Synergy.Entities.api.txt.