Ana içeriğe geç

Kural Tabanlı View Seçimi

Genel Bakış

Kural tabanlı view seçimi, çalışma zamanı koşullarına göre farklı view'ların dinamik olarak seçilmesini sağlar. Bu özellik, iş akışı mantığını değiştirmeden platforma özel arayüzler, role dayalı view'lar ve koşullu UI render'ı sunar.

Kullanım Alanları

  • Platforma özel view'lar: iOS, Android ve Web istemcileri için farklı view'lar gösterme
  • Role dayalı view'lar: Kullanıcı rollerine göre farklı arayüzler sunma
  • Koşullu UI: Instance verisi veya state'e göre view render etme
  • A/B Testi: Deney koşullarına göre farklı view'lar sunma

JSON Şeması

views özelliği view girişlerinden oluşan bir dizi kabul eder. Her girişte, ne zaman seçileceğini belirleyen isteğe bağlı bir rule bulunabilir.

{
"views": [
{
"rule": {
"location": "inline",
"code": "using System.Threading.Tasks;\nusing BBT.Workflow.Scripting;\npublic class ViewIosRule : IConditionMapping\n{\n public async Task<bool> Handler(ScriptContext context)\n {\n try\n {\n if (context.Headers?[\"x-platform\"] == \"ios\")\n {\n return true;\n }\n return false;\n }\n catch (Exception ex)\n {\n return false;\n }\n }\n}",
"encoding": "NAT"
},
"view": {
"domain": "my-domain",
"key": "ios-view",
"version": "1.0.0",
"flow": "sys-views"
},
"loadData": true,
"extensions": ["ext1", "ext2"]
},
{
"view": {
"domain": "my-domain",
"key": "default-view",
"version": "1.0.0",
"flow": "sys-views"
},
"loadData": true
}
]
}

ViewEntry Özellikleri

ÖzellikTipZorunluAçıklama
ruleScriptCodeHayırKoşullu değerlendirme için IConditionMapping uygulayan C# script. Yoksa varsayılan olarak kullanılır.
viewReferenceEvetYüklenecek view bileşenine referans.
loadDatabooleanHayırView ile birlikte instance verisi yüklensin mi. Varsayılan: false.
extensionsstring[]HayırBu view seçildiğinde çalıştırılacak extension listesi.

Rule (ScriptCode) Özellikleri

ÖzellikTipZorunluAçıklama
locationstringHayırScript konumu. Gömülü kod için "inline" kullanın.
codestringEvetIConditionMapping arayüzünü uygulayan C# kodu.
encodingstringHayırDüz metin için "NAT", Base64 için "B64".

View (Reference) Özellikleri

ÖzellikTipZorunluAçıklama
domainstringEvetView'ın kayıtlı olduğu domain.
keystringEvetView'ın benzersiz anahtarı.
versionstringEvetView sürümü (semver formatı).
flowstringEvetFlow tipi, genelde "sys-views".

Kural Değerlendirmesi

Değerlendirme Sırası

  1. View'lar dizi sırasına göre değerlendirilir (baştan sona)
  2. İlk eşleşen kural kazanır ve o view döner
  3. Kuralı olmayan bir giriş varsayılan/fallback olarak kullanılır
  4. Varsayılan view'ı her zaman dizinin sonuna koyun

Kullanılabilir ScriptContext Özellikleri

Handler metodu içinde ScriptContext ile şunlara erişebilirsiniz:

ÖzellikTipAçıklama
context.HeadersDictionaryHTTP istek başlıkları
context.QueryParametersDictionaryURL query parametreleri
context.Instance.DatadynamicMevcut instance verisi
context.Instance.KeystringInstance anahtarı
context.StatestringMevcut state anahtarı
context.TransitionstringMevcut transition anahtarı (varsa)
context.CurrentTransition.DatadynamicOrijinal transition istek gövdesi
context.CurrentTransition.HeaderdynamicOrijinal transition istek başlıkları

Örnekler

Örnek 1: Platforma Göre View Seçimi

x-platform başlığına göre farklı view'lar seçme:

{
"key": "checkout-state",
"stateType": 1,
"views": [
{
"rule": { "location": "inline", "code": "...", "encoding": "NAT" },
"view": { "domain": "ecommerce", "key": "checkout-ios", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
},
{
"rule": { "location": "inline", "code": "...", "encoding": "NAT" },
"view": { "domain": "ecommerce", "key": "checkout-android", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
},
{
"view": { "domain": "ecommerce", "key": "checkout-web", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
}
]
}

Örnek 2: Role Göre View Seçimi

Instance verisindeki kullanıcı rolüne göre farklı view'lar gösterme:

{
"key": "approval-state",
"stateType": 2,
"views": [
{
"rule": { "location": "inline", "code": "...", "encoding": "NAT" },
"view": { "domain": "hr", "key": "approval-admin-view", "version": "1.0.0", "flow": "sys-views" },
"loadData": true,
"extensions": ["adminActions"]
},
{
"view": { "domain": "hr", "key": "approval-default-view", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
}
]
}

Örnek 3: Transition View'ları

Aynı views dizi formatı transition'larda da kullanılabilir:

{
"key": "submit-transition",
"target": "review-state",
"triggerType": 0,
"views": [
{
"rule": { "location": "inline", "code": "...", "encoding": "NAT" },
"view": { "domain": "forms", "key": "submit-mobile-view", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
},
{
"view": { "domain": "forms", "key": "submit-desktop-view", "version": "1.0.0", "flow": "sys-views" },
"loadData": true
}
]
}

En İyi Uygulamalar

  1. Her zaman varsayılan view ekleyin: Kuralı olmayan bir girişi dizinin sonuna fallback olarak koyun.
  2. Kuralları özelden genele sıralayın: Daha özel kurallar önce gelsin.
  3. Kuralları basit tutun: Karmaşık mantık extension veya backend servislerinde olmalı.
  4. Anlamlı view anahtarları kullanın: View'ları açıklayıcı adlandırın (örn. checkout-ios, approval-admin-view).
  5. Tüm yolları test edin: Her kural yolunun uygun koşullarla test edildiğinden emin olun.

Hata Yönetimi

  • Hiçbir kural eşleşmez ve varsayılan view yoksa hata döner
  • Başarısız kural değerlendirmesi loglanır ve sonraki kurala geçilir
  • Geçersiz kural sözdizimi kuralın başarısız olmasına neden olur (sonrakine devam edilir)

İlgili Dokümantasyon