Event Bus और Observer पैटर्न C# (.NET) में: माइक्रोसर्विसेज और GUI के लिए गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Event Bus और Observer पैटर्न C# (.NET) में: थ्योरी से प्रैक्टिकल तक

C# (.NET) में आधुनिक डेवलपमेंट में अक्सर सिस्टम के कंपोनेंट्स के बीच इंटरैक्शन को व्यवस्थित करने की आवश्यकता होती है, जबकि उनकी स्वतंत्रता बनी रहे। Observer पैटर्न और इसका विकसित रूप — Event Bus (इवेंट बस) — लूज़ कपलिंग (loose coupling) को लागू करने के लिए मुख्य टूल हैं। इस आर्टिकल में हम समझेंगे कि ये मैकेनिज्म कैसे काम करते हैं, और C# में एक सरल लेकिन कार्यात्मक Event Bus बनाएंगे।

Observer पैटर्न: क्लासिकल अप्रोच

Observer पैटर्न ऑब्जेक्ट्स के बीच "एक-से-अनेक" संबंध को परिभाषित करता है: जब एक ऑब्जेक्ट (प्रकाशक) अपनी स्थिति बदलता है, तो सभी आश्रित ऑब्जेक्ट्स (सब्सक्राइबर्स) को स्वचालित रूप से सूचित किया जाता है। .NET में यह पैटर्न इवेंट्स (event) और डेलिगेट्स के माध्यम से बिल्ट-इन है।

क्लासिकल इम्प्लीमेंटेशन की कमियां:

  • सब्सक्राइबर की प्रकाशक पर सीधी निर्भरता (ऑब्जेक्ट का रेफरेंस स्टोर करना जरूरी)।
  • बड़े सिस्टम में सब्सक्रिप्शन मैनेज करना मुश्किल।
  • थ्रेड से जुड़ी समस्याएं (मल्टीथ्रेडिंग में अतिरिक्त सिंक्रोनाइजेशन की जरूरत)।

Event Bus: सेंट्रलाइज्ड मीडिएटर

Event Bus इन समस्याओं को एक सेंट्रल मीडिएटर के रूप में काम करके हल करता है। किसी विशिष्ट ऑब्जेक्ट पर सीधे सब्सक्राइब करने के बजाय, कंपोनेंट्स इवेंट बस में रजिस्टर होते हैं। प्रकाशक इवेंट्स को बस में पब्लिश करते हैं, और बस उन्हें सभी सब्सक्राइबर्स को भेजती है। यह Pub/Sub (Publish/Subscribe) पैटर्न को लागू करता है।

Event Bus के फायदे:

  • लूज़ कपलिंग: प्रकाशक और सब्सक्राइबर एक-दूसरे के बारे में कुछ नहीं जानते।
  • स्केलेबिलिटी: नए सब्सक्राइबर्स को जोड़ना आसान।
  • बहुमुखी प्रतिभा: GUI (WPF/WinForms), माइक्रोसर्विसेज और गेम्स (Unity) के लिए उपयुक्त।

C# (.NET) में Event Bus का कार्यान्वयन

हम एक बेसिक Event Bus बनाएंगे जो एसिंक्रोनस प्रोसेसिंग और टाइप किए गए इवेंट्स को सपोर्ट करता है। इसके लिए हम IEvent इंटरफेस और EventBus जेनेरिक क्लास का उपयोग करेंगे।

चरण 1: बेसिक टाइप्स को परिभाषित करें।

// सभी इवेंट्स के लिए बेस इंटरफेस
public interface IEvent { }

// उदाहरण इवेंट - यूजर क्रिएटेड मैसेज
public class UserCreatedEvent : IEvent
{
    public int UserId { get; }
    public string Email { get; }

    public UserCreatedEvent(int userId, string email)
    {
        UserId = userId;
        Email = email;
    }
}

चरण 2: इवेंट बस बनाएं।

using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

public class EventBus
{
    // सब्सक्राइबर्स का स्टोरेज: की - इवेंट टाइप, वैल्यू - हैंडलर्स की लिस्ट
    private readonly ConcurrentDictionary<Type, ConcurrentBag<object>> _subscribers = new();

    // इवेंट पर सब्सक्राइब करें
    public void Subscribe<TEvent>(Func<TEvent, Task> handler) where TEvent : IEvent
    {
        var eventType = typeof(TEvent);
        var handlers = _subscribers.GetOrAdd(eventType, _ => new ConcurrentBag<object>());
        handlers.Add(handler);
    }

    // अनसब्सक्राइब (सरलीकृत - दिए गए टाइप के सभी हैंडलर्स हटाएं)
    public void Unsubscribe<TEvent>() where TEvent : IEvent
    {
        _subscribers.TryRemove(typeof(TEvent), out _);
    }

    // इवेंट पब्लिश करें (एसिंक्रोनस)
    public async Task PublishAsync<TEvent>(TEvent eventData) where TEvent : IEvent
    {
        if (!_subscribers.TryGetValue(typeof(TEvent), out var handlers))
            return;

        foreach (var handler in handlers)
        {
            if (handler is Func<TEvent, Task> typedHandler)
            {
                await typedHandler(eventData);
            }
        }
    }
}

चरण 3: एप्लिकेशन में उपयोग करें।

public class EmailService
{
    public async Task OnUserCreated(UserCreatedEvent evt)
    {                    

अनुशंसाएँ