Home
12 Power Platform Concepts Infographic

12 Power Platform Concepts

Real-World Analogies to Remember
1
Canvas App vs Model-Driven
Canvas App boş bir tuval gibidir — her pikseli sen çizersin. Model-Driven ise hazır bir bina planı gibidir: duvarlar zaten var, sen sadece odaları döşersin.
2
Patch vs SubmitForm
SubmitForm hazır bir kargo formu gibidir — doldur, tek tuşla gönder. Patch ise mektubu elle yazmak gibidir: her alanı, her kaydı, her hedefi sen belirlersin.
3
Dataverse vs SharePoint
Dataverse bir banka kasası gibidir — güvenli, ilişkisel, kurumsal veri için. SharePoint ise bir dosya dolabı — erişimi kolay, ama hassas varlıkları oraya koymaz­sın.
4
Delegation Limit
Gölün tamamına ağ atarak balık yakalamaya çalışma. Filtreleri sunucu tarafına it, istemcide 500 satır limitini asla işleme.
5
ALM: DEV → UAT → PROD
Restoran mutfağı gibi düşün: tarifi DEV'de mükemmelleştir, UAT'ta gerçek misafirlere test et, ancak onay sonrası PROD menüsüne al — tadımı asla atlama.
6
Multi-Level Approval System
Mahkeme sistemi gibi çalışır: ilk yargıç davayı reddederse üst mahkemeye çıkar. Zaman aşımı otomatik yönlendirme tetikler — manuel müdahale gerekmez.
7
Role-Based Access Control
Otel anahtar kartı gibi düşün: müdür her odaya girer, misafir sadece kendi odasına, temizlikçi yalnızca vardiyasında. Güvenlik veri katmanında yaşar, UI'de değil.
8
Failed Flows & Retry Logic
İade mektup gibi: sistem kapıya üç kez çalar, hatayı dead-letter tablosuna yazar ve devam etmeden önce ekibi bilgilendirir.
9
Securing External APIs
Custom Connector pasaport, Azure Key Vault vize ofisi. Kimlik bilgileri asla açıkta dolaşmaz — her zaman çalışma anında güvenli şekilde alınır.
10
C# Plugin (Dataverse)
Plugin bir araba motoru gibidir — olay anında (Create/Update) ateşlenir, transaction içinde çalışır ve bir şeyler ters giderse her şeyi temizce geri alır.
11
Custom Connector
Custom Connector oluşturmak, çilingir tarafından belirli bir kilit için anahtar kesmek gibidir: Power Platform'a şirketinin API'siyle nasıl konuşacağını öğretirsin.
12
AI Agent Architecture
AI agent tasarımı bir restoran gibidir: bot garson (sipariş alır), flow'lar mutfak (işi yapar), knowledge source'lar ise kiler (cevapları sağlar).

Power Platform

Mülakat Hazırlık Rehberi · Analoji Tabanlı Soru-Cevap Kitapçığı
Canvas AppsModel-driven Apps DataversePower Automate Power FXALM Copilot StudioAI Builder Custom ConnectorsC# Plugins

İlke: "Ezberleme değil — anla, anlat, analoji ile köprü kur."

Bölüm 1 — Temel Kavramlar

Power Platform'un yapı taşları. Mülakatın ilk 5 dakikasında bu sorulardan en az biri sorulur.

1.1Canvas App vs Model-driven App — ne zaman hangisini kullanırsın?
🎯 Analoji

Canvas App boş bir tuval gibidir — her pikselini sen çizersin, özgürsün ama her şeyi sen yaparsın. Model-driven App ise hazır bir bina planı gibidir — duvarlar zaten var, sen sadece odaları döşersin.

Canvas App ne zaman?

  • Mobil-öncelikli, görsel olarak özelleştirilmiş UI gerektiğinde
  • Birden fazla farklı veri kaynağına bağlanılacaksa (SharePoint + SQL + Excel)
  • Saha ekipleri için form tabanlı, hızlı veri girişi gerektiğinde
  • Tasarım özgürlüğü ve marka kimliği önemliyse

Model-driven App ne zaman?

  • Veriler Dataverse'te tutuluyorsa ve karmaşık ilişkisel modele sahipse
  • Standart CRUD + iş süreci akışı (Business Process Flow) gerekiyorsa
  • Hızlı geliştirme öncelikliyse, görsel özgürlükten ödün verilebiliyorsa
  • Role-based security önemliyse — Dataverse rolleri otomatik uygulanır
✅ Karar Rehberi

'Sayfa nasıl görünmeli' diye düşünüyorsan → Canvas
'Veri modeli nasıl olmalı' diye düşünüyorsan → Model-driven

1.2Patch vs SubmitForm — gerçek kullanım senaryoları
🎯 Analoji

SubmitForm hazır bir kargo formu gibidir — formu doldurursun, tek tuşla gönderirsin. Patch ise mektubu elle yazan biri gibidir — tam ne yazacağını, nereye göndereceğini, hangi alanı değiştireceğini sen belirlersin.

SubmitForm — Form Kontrolü ile

  • Tek bir Form kontrolüne bağlı, basit CRUD senaryoları
  • Otomatik validation (Required field check) ile
  • OnSuccess / OnFailure event'leri ile geri bildirim
SubmitForm(EditForm1);
// OnSuccess: Navigate(SuccessScreen);
// OnFailure: Notify("Hata oluştu", NotificationType.Error)

Patch — Programatik Kontrol

  • Form kontrolü olmadan, kod ile direkt yazma
  • Birden fazla tabloya aynı anda yazma
  • Conditional updates / Bulk operations
// Yeni kayıt
Patch(Talepler, Defaults(Talepler), {
    Baslik: txtBaslik.Text,
    Tutar: Value(txtTutar.Text),
    Durum: "Beklemede"
});

// Var olan kaydı güncelle
Patch(Talepler, LookUp(Talepler, ID = varSeciliID), {Durum: "Onaylandı"});

// Bulk update
ForAll(SeciliKayitlar As item,
    Patch(Talepler, LookUp(Talepler, ID = item.ID), {Durum: "Kapatildi"})
);
💡 Gerçek Senaryo

Bir 'Sipariş Onay' uygulamasında: Form alanlarını SubmitForm ile gönder, ama onay tarihçesini ayrı bir tabloya Patch ile aynı anda yaz.

1.3Dataverse vs SharePoint — karar senaryoları
🎯 Analoji

Dataverse bir banka kasası gibidir — güvenli, ilişkisel, kurumsal. SharePoint ise ofis dolabıdır — kolay erişilir, basit ihtiyaçlar için yeterli ama büyük kritik veriyi oraya koymazsın.

KriterDataverseSharePoint
Veri Modeliİlişkisel (1:N, N:N)Liste tabanlı, sınırlı ilişki
Max KayıtSınırsız (kapasite ile)30M ama 5K sonrası yavaşlar
DelegationTüm fonksiyonlarKısıtlı (StartsWith, =)
GüvenlikField/record levelList/item level
LisansPremium gerektirirM365 ile gelir
AuditYerleşik, detaylıSınırlı
⚖️ Karar Çerçevesi — Şunlardan biri Evet ise → Dataverse

50.000+ kayıt · Karmaşık ilişkisel sorgular · Field-level security · Audit/compliance · Plugin/business logic

Bölüm 2 — Gerçek Proje Deneyimi

Mülakatçılar burada teknik bilgi değil, gerçek deneyim arar. STAR yapısını kullanın.

2.1Projenizi baştan sona anlatın
🎯 Analoji

Bina inşa etmek gibi: Zemin etüdü (iş analizi) → Mimari plan (data model) → İnşaat (uygulama) → Tesisat (entegrasyon) → İskelet testi (UAT) → Anahtar teslim (deployment).

STAR Çerçevesi

  • Situation — İş ihtiyacı neydi? (Ör: 200 kişilik İK ekibi izin taleplerini Excel'de takip ediyordu)
  • Task — Sorumluluğunuz neydi? (Ör: Uçtan uca otomatik izin yönetim çözümü)
  • Action — Nasıl çözdünüz? (Ör: Dataverse + Canvas App + Power Automate + Power BI)
  • Result — Ölçülebilir sonuç? (Ör: Onay süresi 5 günden 4 saate düştü)
🎤 Sunum Tüyosu

Mülakatçıya 'Bir mimari diyagram çizebilir miyim?' diye sor. 4 kutu çiz: Veri | Mantık | UI | Entegrasyon. Bu, senin 'sistem düşündüğünü' kanıtlar.

2.2Karşılaştığın zorluklar ve çözümlerin
ZorlukÇözüm
Delegation limitiServer-side filtreleme + Collection cache + Dataverse'e geçiş
Flow timeoutAsync pattern + Do Until + child flow ile parçalama
Eş zamanlı güncellemeRowVersion + IsBlank kontrolü
Offline çalışmaSaveData / LoadData + Connection.Connected
UAT vs PROD farkıSolution + Environment Variables + Connection References
Yavaş açılış (15+ sn)OnStart yerine OnVisible / Concurrent()
2.3Teknik olarak en zor kısım neydi?
  • Çoklu tablo Patch işleminde transaction yönetimi (rollback mantığı)
  • Çok seviyeli onay sürecinde dinamik approval matrix kurma
  • Custom Connector OAuth2 flow'unda token refresh stratejisi
  • Plugin'de Pre-image / Post-image karşılaştırması
  • Büyük dataset'te delegation problemini çözerken UX kaybetmemek
🎯 Altın Kural

'En zor kısım' sorusuna teknik bir detay ver, sonra 'nasıl öğrendim ve dokümante ettim' kısmına geç. Mülakatçı zorluğa değil, çözüm yöntemine değer verir.

Bölüm 3 — Senior Seviye Senaryolar

Bu sorular düşünce yapını ve mimari yaklaşımını ölçer. Trade-off'lardan bahset.

3.1Çok seviyeli onay sistemi nasıl tasarlarsın?
🎯 Analoji

Mahkeme sistemi gibi — ilk hâkim reddederse dava üst mahkemeye çıkar. Her seviyede farklı yetkili, süre dolunca otomatik escalation.

Trigger: Yeni talep oluşturuldu ↓ Get Approval Matrix (level=1, amount range) ↓ Send Approval Request (Approvals connector) ↓ Wait (timeout: 48 saat) ↓ [Onaylandı?] ├─ Evet → Bir sonraki seviyeye geç → Tekrar et ├─ Hayır → Kullanıcıya geri bildirim, talep kapat └─ Timeout → Manager'ın manager'ına escalate ↓ Final Level → Status = "Onaylandı"
🛡️ Fallback Stratejisi

1. Timeout → 1 üst seviyeye otomatik escalate
2. Approver yoksa → Out-of-office delegate'e
3. Tüm seviyeler timeout → Sistem yöneticisine bildirim

3.2Büyük veride performans düşerse ne yaparsın?
SorunÇözüm
OnStart çok yavaşConcurrent() + sadece zorunlu veri, gerisi OnVisible
Gallery scroll donuyorTop N + lazy loading + delegation-friendly filter
Delegation warningStartsWith yerine Filter, server-side index
Çok fazla LookUpClearCollect ile preload + collection üzerinden işle
Aynı veriyi tekrar çekiyorCollection cache + Set() global değişken
Image render yavaşAzureBlob + thumbnail URL
3.3Delegation limitlerini nasıl yönetirsin?
🎯 Analoji

Olta ile balık avlamak gibi — tüm gölü ağla taramak yerine doğru noktaya olta atarsın.

  • Power Apps varsayılan delegation limiti: 500 (max 2000)
  • Non-delegable fonksiyonlar client'ta sadece ilk 500-2000'i alır → eksik veri
Delegable ✅Non-delegable ❌
Filter, Search, LookUpSort by formula
StartsWith, EndsWith, InDistinct (kısmen)
Sum, Average, Min, MaxConcat, Concatenate
= != < > <= >=Mid, Left, Right
⚠️ Kaçınma Stratejisi

1. Sarı delegation uyarısını ASLA görmezden gelme
2. Limit'i 2000'e çıkarmak çözüm değil, ertelemedir
3. Filtreyi sunucuya sok — Dataverse'e veya SQL view'a taşı
4. Pagination / infinite scroll uygula

3.4Role-based access nasıl tasarlarsın?
🎯 Analoji

Otel kartı sistemi gibi — resepsiyonist lobiye girer, misafir kendi odasına, müdür her yere.

  • Environment seviyesi: Maker / User / System Admin rolleri
  • App seviyesi: Co-owner / User olarak paylaşma
  • Data seviyesi (Dataverse): Security Role → Privilege + Access Level
  • Record seviyesi: Owner-based veya Sharing ile (Hierarchical Security)
  • Field seviyesi: Field Security Profile ile hassas alanları gizle
  • UI seviyesi: User().Email + If() ile butonları gizle (kozmetik!)
🔒 Altın Kural

UI üzerinde gizleme = sadece kozmetiktir. Gerçek güvenlik HER ZAMAN data layer'da (Dataverse roles) yapılmalı. Aksi halde 'Inspect Element' veya Web API çağrısıyla data sızar.

3.5ALM (DEV → UAT → PROD) süreci nasıl yönetilir?
🎯 Analoji

Restoran mutfağı gibi — tarifi DEV'de geliştirirsin, müşteri grubuna UAT'da tattırırsın, beğenilince PROD menüsüne alırsın.

  • Unmanaged Solution: DEV ortamında — düzenlenebilir
  • Managed Solution: UAT ve PROD'da — kilitli
  • Pipelines: GUI tabanlı, Microsoft önerisi
  • Azure DevOps + Build Tools: Klasik, esnek
  • GitHub Actions: PAC CLI ile otomatik export → import
🚨 ALM Yapma Hataları

❌ PROD'da doğrudan değişiklik · ❌ Unmanaged solution'ı PROD'a taşımak · ❌ Connection'ları manuel kurmak · ❌ Environment Variable yerine hardcoded URL · ❌ Versiyon kontrol olmadan deploy

3.6Başarısız flow'lar ve retry mekanizması
🎯 Analoji

Ulaşmayan mektup gibi — posta sistemi 3 kez kapıya gider, yine yoksa depoya bırakır.

  • Retry Policy: Default (4 retry, exponential backoff), Fixed, None
  • Try-Catch-Finally Pattern: Üç Scope kullan
  • Configure Run After: Catch → Try'in 'has failed / timed out / skipped'
  • Dead-letter table: Başarısız payload'ları Dataverse'e kaydet
[Try Scope]
   - Get items → Apply to each → HTTP call → Update record

[Catch Scope]  ← Run after Try: Has Failed
   - Compose: error details
   - Insert error to dlq_FailedRequests table
   - Send Teams alert
   - Terminate (Status: Failed)

[Finally Scope]  ← Always
   - Log execution metrics
🔁 Retry Stratejisi

Idempotent işlemler → Retry açık  |  Non-idempotent (kart çekme, mail gönderme) → Retry KAPALI veya idempotency key ile

3.7Harici API entegrasyonunu güvenli nasıl yaparsın?
  • Credentials → Azure Key Vault, asla connector'a hardcoded yazma
  • Auth: OAuth 2.0 > API Key > Basic (sırayla tercih)
  • Custom Connector kullan (HTTP action yerine — denetim, DLP)
  • On-prem Data Gateway → Şirket içi API'ler için
  • Service Principal → kullanıcı bağımsız erişim
Power App → Custom Connector → Azure API Management → Backend API
                    ↑
              Azure Key Vault (secrets)
                    ↑
           Azure AD App Registration (OAuth2)

Bölüm 4 — Düşünce Yapısı & Sahiplenme

Bu sorular kişiliğini ve kariyer motivasyonunu ölçer. Samimi ol, ezbere kaçınma.

4.1Bu rol seni neden heyecanlandırıyor?
🎯 Analoji

Elektrikçi olmak gibi — duvarların arkasındaki kabloları sen döşersin, sabah ofise gelen herkes ışıkları açar ve fark bile etmez. Görünmez ama hayati.

  • Etki: Kullanıcının saatlerce süren işini dakikalara indirmek
  • Çeşitlilik: Aynı platformda hem UI, hem mantık, hem entegrasyon
  • Hız: Pro-code'a kıyasla aynı çıktıyı 10x hızda verebilmek
  • Demokratikleşme: Citizen developer'a güç vermek, IT'nin yükünü azaltmak
  • Öğrenme: AI Builder, Copilot Studio gibi en yeni teknolojilere erken erişim
4.2Hangi tür projelerde çalışmaktan keyif alıyorsun?
  • Manuel süreçleri otomatize eden, ölçülebilir ROI'si olan projeler
  • Çoklu sistem entegrasyonu içeren mimari zorluklar
  • Son kullanıcı ile direkt etkileşim — feedback'in hızlı geldiği projeler
  • AI ile zenginleştirilmiş workflow'lar (Copilot, Form Processing)
  • End-to-end sahiplenebilen, design'dan deployment'a giden projeler

Bölüm 5 — Teknik Detaylar

5.1Offline capability — internetsiz çalışma
🎯 Analoji

Uçakta rehber kitap taşımak gibi — uçmadan önce ihtiyacın olan sayfaları indirirsin, internetsiz okursun, yere inince notlarını buluta senkronize edersin.

// OnStart - veriyi cihazdan yükle
If(Connection.Connected,
    ClearCollect(colTalepler, Talepler);
    SaveData(colTalepler, "TaleplerCache"),
    LoadData(colTalepler, "TaleplerCache", true)
);

// Yeni kayıt — offline ise queue'ya ekle
If(Connection.Connected,
    Patch(Talepler, Defaults(Talepler), formData),
    Collect(colPendingSync, formData);
    SaveData(colPendingSync, "PendingSync")
);

// Bağlantı geri gelince sync
If(Connection.Connected && CountRows(colPendingSync) > 0,
    ForAll(colPendingSync As item,
        Patch(Talepler, Defaults(Talepler), item)
    );
    Clear(colPendingSync); SaveData(colPendingSync, "PendingSync")
);
5.2Custom Connector vs Standart Connector
KriterStandartCustom
GeliştiriciMicrosoft / PartnerSen / Ekibin
Kapsam1000+ hazır servisŞirket içi API'ler
LisansPlan'a görePremium
AuthYapılmışSenin tanımın
🔧 Ne Zaman Custom?

Standart connector listesini ARA → yoksa custom yap. Bazen REST/HTTP action ile başla, sonra refactor et.

5.3Component Library
🎯 Analoji

LEGO fabrikası gibi — bir kere üret, her yerde kullan. Renk değiştirmek istersen fabrikadan çık, kalıbı değiştir → tüm uygulamalar otomatik güncellenir.

  • Canvas Component — drag-drop UI parçası (header, footer, custom dropdown)
  • PCF — TypeScript ile yazılan ileri seviye component
  • Component Library — organizasyon-wide paylaşım
5.4Power FX formülü nasıl optimize edersin?
// ❌ YAVAŞ
ForAll(Talepler, Patch(Log, Defaults(Log), {Tutar: ThisRecord.Tutar}))

// ✅ HIZLI
Patch(Log, ForAll(Talepler As t, {Tutar: t.Tutar}))

// ❌ YAVAŞ — her seferinde yeniden çekiyor
LookUp(Talepler, ID = varID).Baslik

// ✅ HIZLI — With ile cache
With({rec: LookUp(Talepler, ID = varID)}, rec.Baslik)

Bölüm 6 — Mimari (Senior Seviye)

6.1Solution Segmentation — çözümleri nasıl bölersin?
SolutionİçerikBağımlılık
Core (Foundation)Ortak entity, choice, security rolesHiçbir şeye bağlı değil
Shared ComponentsComponent library, theme, custom connectorsCore
App-AApp-A'ya özgü flow + canvas + PCFCore, Shared
App-BApp-B'ye özgü flow + canvasCore, Shared
IntegrationsCustom connector, environment varsCore
📦 Anti-Pattern

Tek bir devasa solution = monolith. Bir component'i değiştirmek için tüm solution'ı yeniden deploy etmek zorundasın.

6.2Power Platform Governance
  • DLP Policies: Connector'ları Business / Non-Business / Blocked grupla
  • Environment Strategy: Default ≠ üretim. Ayrı DEV, UAT, PROD
  • CoE Starter Kit: Admin dashboard, app inventory, maker analytics
  • Maker Onboarding: Eğitim + sandbox + branding rehberi
  • Audit & Compliance: Audit logs, Purview entegrasyonu
Environment TipiAmaç
DefaultTüm makers'ın ortak alanı — production için ÖNERİLMEZ
ProductionCanlı uygulamalar
SandboxUAT, DEV — sıfırlanabilir, copy edilebilir
DeveloperBireysel maker için ücretsiz, full feature
TeamsMicrosoft Teams için ücretsiz, sınırlı Dataverse

Bölüm 7 — AI Agents & Copilot Studio

AI ajan tasarımı modern Power Platform mülakatlarının vazgeçilmezi. Microsoft, Power Virtual Agents'ı 2024'te Copilot Studio olarak yeniden markaladı.

7.1Copilot Studio nedir, nasıl çalışır?
🎯 Analoji

Eğitilmiş bir resepsiyonist gibi — soruları anlar, doğru kaynağa yönlendirir, gerektiğinde başkasıyla konuşur, bilmediğini sana sorar.

  • Topics: Konuşma akışları — trigger phrase + branching mantığı
  • Entities: Kullanıcı mesajından çekilen yapılandırılmış bilgi
  • Generative Answers: SharePoint, web, Dataverse'ten AI yanıt
  • Actions: Power Automate flow tetikleme, harici API çağırma
  • Channels: Teams, Web, Slack, Telegram — aynı bot, çoklu kanal
ModAçıklama
Classic (no-code)Topics + nodes ile akış tabanlı kurulum
Generative (AI-first)LLM kararıyla dinamik akış
HybridKritik akışlar topic, açık uçlu sorular generative
7.2AI Builder vs Copilot Studio
🎯 Analoji

AI Builder LEGO'nun pre-built modelleri gibi. Copilot Studio ise LEGO'larla robot yapmak — hazır yetenekleri kullanarak konuşan asistan kurarsın.

ÖzellikAI BuilderCopilot Studio
AmaçYetenek (skill)Konuşma ajanı
KullanımFlow / App içinde aksiyonStandalone bot
ÇıktıYapılandırılmış dataDoğal dil yanıt
🤝 Birlikte Kullanım

Copilot Studio bot'u → Action olarak Power Automate'i çağırır → Flow içinde AI Builder OCR ile fatura okur → Sonuç bot'a döner.

7.3AI Ajan tasarlarsam mimari nasıl olmalı?
┌─────────────────────────────────────────────┐ │ Channel (Teams / Web / Mobile) │ ← Kullanıcı arayüzü ├─────────────────────────────────────────────┤ │ Copilot Studio (NLU + Topic Engine) │ ← Anlama + akış ├─────────────────────────────────────────────┤ │ Knowledge Sources │ │ • SharePoint • Dataverse • Web URL │ ← Bilgi ├─────────────────────────────────────────────┤ │ Actions Layer │ │ • Power Automate Flows │ ← İş mantığı │ • Connectors (Standard / Custom) │ │ • Plugins (OpenAPI / M365) │ ├─────────────────────────────────────────────┤ │ Backend │ │ • Dataverse • Azure • External APIs │ ← Veri & sistem └─────────────────────────────────────────────┘ └── Identity: Microsoft Entra ID (AAD) └── Governance: DLP, audit, content moderation
🤖 Prompt Engineering İpucu

3 katman: 1) Persona ('Sen bir İK asistanısın') · 2) Constraint ('Sadece izin/maaş konuları') · 3) Format ('Cevapları madde madde ver')

Bölüm 8 — Custom Connectors (Derinlemesine)

8.1Custom Connector nasıl yapılır — uçtan uca
  • 4 Yöntem: OpenAPI 2.0 (Swagger) · Postman Collection · Boş başlat · Azure Service
  • 1. General — Icon, color, description, host URL
  • 2. Security — Auth type: No auth / Basic / API Key / OAuth 2.0 / AAD
  • 3. Definition — Actions ve Triggers tanımla
  • 4. Code (preview) — C# script ile request/response transform
  • 5. Test — Connection oluştur → operation çalıştır → response gör
8.2Authentication türleri
TipKullanımGüvenlik
No AuthPublic API, dev/testDüşük
BasicUsername + PasswordDüşük (HTTPS şart)
API KeyHeader veya query stringOrta
OAuth 2.0Authorization Code flowYüksek
AAD (Entra)Microsoft tenant API'leriÇok yüksek
8.3Policies ve Code section
  • Set HTTP Header — sabit header ekle
  • Route Request — version'a göre URL değiştir
  • Set Host URL — environment'a göre switch
  • Throttle by key — rate limit
public class Script : ScriptBase
{
    public override async Task<HttpResponseMessage> ExecuteAsync()
    {
        var content = await Context.Request.Content.ReadAsStringAsync();
        var json = JObject.Parse(content);
        json["timestamp"] = DateTime.UtcNow.ToString("o");
        Context.Request.Content = CreateJsonContent(json.ToString());
        return await Context.SendAsync(Context.Request, CancellationToken);
    }
}

Bölüm 9 — C# Plugins (Dataverse)

Plugin'ler Dataverse'in motor odasıdır — server-side, sync/async, transaction içinde çalışan business logic.

9.1Plugin nedir, ne zaman kullanılır?
YöntemNe zaman kullan?
Business RuleForm-level, basit if-then, sadece UI
Power Automate FlowAsync, harici sistem, low-code
Custom APIReusable server-side action
PLUGINSync, complex, transaction-aware, kritik logic
9.2Plugin pipeline ve stages
StageNoNe zaman?
Pre-validation10Transaction'dan ÖNCE — yetki kontrolü
Pre-operation20Transaction içinde, DB write'tan ÖNCE
Main operation30Dataverse core operation — değiştirilemez
Post-operation40DB write'tan SONRA — sync child write
Post-operation async40Background — email, integration
9.3Plugin örnek kodu
public class HesapValidationPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider
            .GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory)serviceProvider
            .GetService(typeof(IOrganizationServiceFactory));
        var service = serviceFactory.CreateOrganizationService(context.UserId);
        var tracingService = (ITracingService)serviceProvider
            .GetService(typeof(ITracingService));

        if (context.MessageName != "Create" && context.MessageName != "Update") return;
        if (!(context.InputParameters["Target"] is Entity target)) return;
        if (target.LogicalName != "account") return;

        try {
            if (target.Contains("revenue")) {
                var revenue = target.GetAttributeValue<Money>("revenue");
                if (revenue.Value > 1000000 && !target.Contains("creditrating"))
                    throw new InvalidPluginExecutionException(
                        "1M üstü hesaplar için credit rating zorunludur");
            }
        }
        catch (InvalidPluginExecutionException) { throw; }
        catch (Exception ex) {
            throw new InvalidPluginExecutionException("Plugin hatası: " + ex.Message, ex);
        }
    }
}
9.4Plugin Best Practices
  • ✅ Filtering attributes kullan — gereksiz tetiklenme önle
  • ✅ Tracing service ile log yaz
  • ✅ Stateless yaz — instance variable kullanma
  • ✅ Depth check: if (context.Depth > 1) return; — sonsuz döngüyü engelle
  • ❌ External HTTP call YAPMA (sandbox kısıtlı)
  • ❌ Long-running işlem yapma (2 dk sync, 24 saat async limit)
  • ❌ Hardcoded GUID/URL kullanma

Bölüm 10 — Power Automate (Cloud + Desktop / RPA)

10.1Cloud Flows vs Desktop Flows (RPA)
🎯 Analoji

Cloud Flow telefon görüşmesi gibi — uzaktan, dijital. Desktop Flow ise fiziksel asistan — bilgisayarın başında ekran tıklayan robot.

ÖzellikCloud FlowDesktop Flow (RPA)
HedefAPI'ler, connectorsEski uygulamalar, web UI, Excel
HızSaniyeDakika (UI etkileşimi)
KırılganlıkAz (API contract)Yüksek (UI değişirse bozulur)
KullanımModern sistemlerLegacy, SAP, eski ERP
🤝 Hibrit Senaryo

Cloud Flow tetikler → Desktop Flow eski sistemde işi yapar → Sonucu Cloud Flow'a döner → Modern sistemlere yazar.

10.2Trigger türleri
  • Automated: Olay-tabanlı — When item is created, When email arrives
  • Instant (Manual): Kullanıcı tetikler — Power App'ten, mobil, button
  • Scheduled: Zamanlanmış — günde 1 kez, her Pazartesi 09:00
  • Polling: Power Automate her N dakikada bir API'yi sorar
  • Webhook: Servis Power Automate'e push eder (anlık, daha az kaynak)
10.3Concurrency & Performans
  • Trigger concurrency — aynı trigger'dan eşzamanlı kaç flow run? (1-100)
  • Apply to each → Concurrency Control (1-50)
  • ✅ Aç: Bağımsız öğeler işleniyorsa — performans artışı
  • ❌ Kapat: Sıra önemliyse veya shared resource varsa (counter)
⚡ Hız İpucu

Çoğu flow'un yavaşlığı 'Apply to each' içindeki sequential işlemden gelir. 20+ item varsa concurrency 10-20 yap.

Bölüm 11 — Dataverse Derinlemesine

11.1Dataverse'in temel yapı taşları
  • Tables — Standard / Custom / Activity / Virtual
  • Columns — Text, Number, Currency, Date, Choice, Lookup, File, Calculated, Roll-up
  • Relationships — 1:N, N:1, N:N
  • Choices — Global veya local enum
  • Business Rules — UI/Server level basit kurallar
CalculatedRoll-up
ZamanlamaAnlık hesaplanır12 saatte bir (+ manuel)
KapsamTek satır içindeParent-child agregasyonu
PerformansEtkisi azAsync job — büyük veride yavaşlayabilir
11.2Virtual Tables
🎯 Analoji

Aynaya benzer — Dataverse'te tablo gibi görünür ama veri başka yerde (SQL, OData, SharePoint, Cosmos).

  • ✅ Veri replikasyonu YOK — kaynak sistemde yaşar
  • ✅ Power Apps, flow'da normal tablo gibi kullanılır
  • ❌ Plugin / Workflow trigger LIMITED
  • ❌ Performans — kaynak sistemin hızına bağımlı
11.3Dataverse for Teams vs Tam Dataverse
ÖzellikDataverse for TeamsTam Dataverse
LisansM365 ile ücretsizPremium
Plugins
Custom Connectors
Audit
ChannelSadece TeamsWeb, mobile, Teams

Bölüm 12 — Güvenlik & Yetkilendirme

12.1Dataverse Güvenlik Modeli — katmanlar
  • 1. Tenant: Microsoft 365 yönetici düzeyi
  • 2. Environment: Maker/User/Admin rolü
  • 3. Business Unit: Departman/şirket
  • 4. Security Role: Privilege seti
  • 5. Team: Owner / Access / AAD Group
  • 6. Record Sharing: Tek kayda bireysel yetki
  • 7. Field Security Profile: Kolon seviyesinde mask/read/write
  • 8. Hierarchical Security: Manager kendi altındakileri görür
PrivilegeAccess Level
Create / Read / Write / DeleteUser (sadece kendi)
Append / Append ToBusiness Unit (kendi BU)
AssignParent: Child Business Units
ShareOrganization (tüm tenant)
12.2Service Principal & Application User
  • 1. Azure AD'de App Registration oluştur
  • 2. Client ID + Secret (veya certificate) oluştur
  • 3. Power Platform admin → Application Users → New
  • 4. Security Role ata
  • 5. OAuth 2.0 client_credentials flow ile token al, API çağır

Bölüm 13 — Power BI Entegrasyonu

13.1Power Platform içinde Power BI'ın rolü
  • Power BI tile — Canvas App içine embed
  • Power Automate — Power BI dataset refresh tetikleme
  • Power BI alert → Power Automate → Action (anomaly detection)
  • Streaming dataset — real-time KPI dashboard
🎯 Senior İpucu

'Ekibe rapor paylaşmanın en hızlı yolu' = Power BI Workspace + RLS + Teams kanalına embed.

13.2Dataverse → Power BI bağlantı yöntemleri
YöntemAvantajDezavantaj
ImportHızlı, tüm DAX, offlineRefresh gerekir
DirectQueryAnlık veriYavaş, DAX kısıtlı
Dataverse ConnectorNative, optimalPremium gerekebilir
TDS Endpoint (SQL)T-SQL ile sorguRead-only, sınırlı

Bölüm 14 — Genel Best Practices

Tüm rehberin damıtılmış hali. 'Projende neye dikkat ediyorsun?' sorusuna 5 madde say, kazanırsın.

Naming Conventions

  • Tablo: PascalCase, tekil — IzinTalebi, MaliyetMerkezi
  • Kolon: camelCase / prefix — pp_durum
  • Solution: CompanyName_AppName_Typecontoso_hr_managed
  • Flow: Verb-Noun-Trigger — CreateApprovalRequest_OnNewItem
  • Variable: var prefix · Collection: col prefix · Component: cmp prefix

Performance

  • OnStart kısa tut — kritik olmayanı OnVisible'a ertele
  • Concurrent() ile paralel yükleme
  • Delegation-friendly fonksiyonlar kullan
  • UpdateContext > Set (scope avantajı)

Security

  • Hardcoded credentials YASAK — Environment Variable / Key Vault
  • UI-level gizleme ≠ data-level güvenlik
  • Service Principal ile entegrasyon
  • DLP policy'leri tanımla · Audit log aktif

Error Handling

  • Try-Catch-Finally pattern (flow'da Scope'lar)
  • IfError() ile Power FX
  • Notify() ile kullanıcıya geribildirim
  • Plugin'de InvalidPluginExecutionException
  • Dead-letter queue başarısız mesajlar için · Retry policy + idempotency

Maintenance

  • Solution + Source Control (Azure DevOps / GitHub)
  • Comments — flow'da Note action, formüllerde // yorum
  • Versioning — major.minor.patch
  • Documentation — README, mimari diyagramı, decision log
💎 Altın İlke

Mülakatta kazanan 'en çok bilen' değil, 'en net düşünen'dir.

1. Problemi anlat (analoji ile)  ·  2. Çözümü mantığıyla açıkla  ·  3. Trade-off'u söyle

İyi Şanslar! 🚀