ASP.Net Core Projesinde Event Driven Architecture

Emre Kizildas
Emre Kızıldaş
Published in
4 min readFeb 29, 2020

Merhaba 👋🏼 Bu makalemde sizlerle bir ASP.Net Core projesinde Event Driven Programming (EDP) yani Türkçe ‘si Olay Güdümlü Programlama nasıl uygulanır? Bu yaklaşım uygulanırken kullanabilen tasarım desenleri nelerdir? Bunlardan bahsedeceğim.

Başlamadan Önce..

Makalemde sizlerle; bir ASP.Net Core API projesi oluşturup bunun üzerinden sizlerle, araştırmalarım sonucunda öğrendiğim bir tasarım deseni ve bu desen kullanılarak yazdığım Event Driven Programming yaklaşımından bahsediyor olacağım. İlgili projemin eksikliklerini veya yanlışlıklarını farkederseniz bu yazının altına yorum olarak belirttiğinizde, sizde yazıma katkıda bulunmuş olursunuz. 🙂

Event Driven Programming Nedir?

Türkçe’ si olay güdümlü programlama olarak çevrilebilen bu yaklaşıma ait internette onlarca tanım mevcut. Bu tanımları incelediğimde makalemde kullanabileceğim ve benim de anlamama faydalı olan şu ifadeler bu yaklaşımın anlaşılmasını oldukça kolaylaştırıyor:

Olaya dayalı programlama genel anlamıyla, dışarıdan gelen etkilere (olaylara) tepki vermek üzere yazılım geliştirmek anlamına gelmektedir. Bu etkiler kullanıcının butona basması, listedeki bir öğeyi seçmesi, bir nesneyi seçip başka bir yere taşıması gibi aktiviteler olabileceği gibi, işletim sisteminden gelen pil azalıyor, elektrik bağlantısı kesildi, internet bağlantısı koptu, bilgisayar kapatılıyor gibi sinyaller de olabilmektedir. Diğer taraftan bir sensörden gelen değerler ya da sinyaller de olay olarak ya da etki olarak kabul edilebilir.

CHIP Online — https://www.chip.com.tr/blog/kadircamoglu/olaya-dayali-programlama_5522.html

Şimdi bu yaklaşımı bir ASP.Net Core API Projesinde nasıl kullanabiliriz bunu inceleyeceğiz. Bu yaklaşımla yazılımınızı kodlarken kullanabileceğiniz bir kaç tasarım paterni bulunmaktadır. Bunlardan en çok öne çıkanı Publish-Subscribe (Pub-Sub) tasarım paternidir.

Publish-Subscribe (Pub-Sub) Design Pattern Nedir?

Bir olay zincirini başlatan ve her bir olay bittiğinde takip eden diğer olayı tetikleyen şekilde tasarlanan bir desendir. Bu tasarım paternini delegateler veya eventlar yardımıyla kullanabiliriz.

  • Publisher: Olayı başlatan sınıfdır. Her olayın kaynağı bu sınıfdır.
  • Subscriber: Olayı takip eden sınıftır.

Bu tasarım deseninin 4 adımda tanımlayabiliriz:

1- Olayı tanımlamak.

2- Publisher (Tetikleyici) yi tanımlamak.

3- Subscriber (Takipçi) yi tanımlamak.

4- Publisher’ a Subscriber ‘ı bağlamak.

Örnek: Hava Durumu Tahmini Servisi

ASP.Net Core API projesini oluşturduğumuzda varsayılan olarak gelen hava durumu temasını Event Driven Programming yaklaşımı ile düzenleyeceğiz.

dotnet new api -n EventDrivenExample

Uygulamamızda hava durumu servisi çağrıldığında önümüzdeki 5 günün hava durumu rastgele dönecek ve aynı zamanda bir Audit log oluşturacak.

Normalde projemizi şu şekilde yazarız.

Projemizin /WeatherForecast yoluna gönderilen GET isteklerinde WeatherForecastService sınıfından 5 günlük tahmini hava durumu tahmini listesi alınır ve ardından bu durum uygulama konsoluna yazdırılır. Kullanıcıya ise bu tahmin JSON olarak döndürülür.

5 Günlük Hava Durumu Tahmini Yapan Servis
Audit Log Yazan Servis
Yapılan GET isteğine dönen cevap yukarıdaki şekilde konsola yansımaktadır.

Şimdi beraber bu klasik mimariden olay güdümlü mimarimize geçiş yapalım.

Event Driven Architecture Kullanımı

Yukarıdaki örneği, Event Driven Programming yaklaşımıyla refactor edelim.

1- Olayı Tanımlayalım

Bu örneğimizde olayımızı WeatherForecastEventArgs olarak tanımlayacağız. İlgili olayda bilmem gereken tek değer var: gün. Bu sebeple bu değeri bir parametre olarak ekliyoruz.

2- Publisher (tetikleyici) Tanımlayalım

Olayların başlatıcısı olan Publisher; bu örneğimizde WeatherForecastService sınıfı olacaktır.

Burada dikkat edilmesi gereken noktalar:

  • EventHandler property’si bu sınıfa diğer metodların bağlanmasına olanak sağlar.
  • Ayrıca her hava durumu tahmini sorgulamasından sonra da OnWeatherTransactionProcessed eventhandler’ına bildirim gönderilir.

3- Subscriber tanımlayalım

Olayın gerçekleşmesinin ardından harekete geçen sınıf olarak tanımlayabiliriz. Bu örneğimizde ilgili sınıf AuditService sınıfıdır.

  • Subscribe() metodu AuditService sınıfının WeatherForecastService sınıfına bağlanmasına olanak sağlar.
  • WriteAuditLog metodu artık private olarak işaretlendi. İlgili metod WeatherForecastService sınıfındaki OnWeatherTransactionProcessed eventhandler’ını takip ediyor.

4- Controller Sınıfını Refactor Edelim

Publisher ve Subscriber sınıflarımızı hazırladıktan sonra Controller sınıfımızı Event Driven Mimari’ye uyumlu hale getirebilmek için Pub-Sub tasarım desenini (Design Pattern) kullanarak refactor edelim.

Artık hava durumu servisimizden hava durumunu sorguladığımızda ilgili metoda bağlanan log metodu ile kaç günlük hava durumu sorgulandığı konsola yazdırılacak.

https://localhost:5001/WeatherForecast/?days=3

Makalemin burada sonuna geldim. Umarım ilgili mimarinin temellerini anlaşılır biçimde yazıya aktarabilmişimdir. Bu projeden yola çıkarak kendi repo’larınızda da ihtiyacınıza uygun olarak mimariyi genişletebilirsiniz. İlgili projenin kaynak kodlarına GitHub hesabımdan ulaşabilirsiniz.

--

--