C# (.NET) में Event Bus और Observer पैटर्न: कार्यान्वयन और उदाहरण

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

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

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

C# (.NET) में Event Bus और Observer पैटर्न: सिद्धांत से व्यवहार तक



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



Observer पैटर्न क्या है?

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



शास्त्रीय कार्यान्वयन की समस्या

हालांकि C# के अंतर्निहित इवेंट अच्छी तरह से काम करते हैं, उनकी कुछ सीमाएँ हैं:

  • प्रत्यक्ष संबंध: प्रकाशक को सब्सक्राइबर्स के बारे में स्पष्ट रूप से जानना होता है।
  • सब्सक्रिप्शन रद्द करने में कठिनाई: यदि सब्सक्राइबर सब्सक्राइब करना भूल जाता है, तो मेमोरी लीक होती है।
  • सीमित लचीलापन: अतुल्यकालिक प्रसंस्करण या इवेंट फ़िल्टरिंग को व्यवस्थित करना कठिन है।


Event Bus क्या है?

Event Bus — एक केंद्रीकृत बस (मध्यस्थ) है जो Publisher-Subscriber (प्रकाशक-सब्सक्राइबर) पैटर्न को लागू करती है। शास्त्रीय Observer के विपरीत, प्रकाशक और सब्सक्राइबर एक-दूसरे के बारे में बिल्कुल नहीं जानते। वे केवल बस के माध्यम से संवाद करते हैं:

  • प्रकाशक बस में एक संदेश (इवेंट) भेजता है।
  • बस इस प्रकार के इवेंट के सभी सब्सक्राइबर्स को ढूंढती है और उन्हें सूचित करती है।
  • सब्सक्राइबर एक विशिष्ट प्रकार के इवेंट के लिए पंजीकृत होता है और उसे संसाधित करता है।


Event Bus के लाभ

  • कमजोर युग्मन: घटक एक-दूसरे पर निर्भर नहीं होते।
  • स्केलेबिलिटी: नए सब्सक्राइबर्स को जोड़ना आसान है।
  • परीक्षण क्षमता: बस को मॉक से बदला जा सकता है।
  • अतुल्यकालिकता: इवेंट को पृष्ठभूमि थ्रेड में संसाधित किया जा सकता है।


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

एक सरल लेकिन कार्यात्मक कार्यान्वयन पर विचार करें। हम एक EventBus क्लास बनाएंगे जो सब्सक्राइबर्स का एक शब्दकोश संग्रहीत करेगी।



public interface IEventBus{    void Publish<TEvent>(TEvent eventData) where TEvent : class;    IDisposable Subscribe<TEvent>(Action<TEvent> handler) where TEvent : class;}

public class EventBus : IEventBus{ private readonly Dictionary<Type, List<Delegate>> _subscribers = new(); private readonly object _lock = new();

public void Publish<TEvent>(TEvent eventData) where TEvent : class { List<Delegate> handlers; lock (_lock) { if (!_subscribers.TryGetValue(typeof(TEvent), out var list)) return; handlers = new List<Delegate>(list); }

foreach (var handler in handlers) { if (handler is Action<TEvent> action) action(eventData); } }

public IDisposable Subscribe<TEvent>(Action<TEvent> handler) where TEvent : class { lock (_lock) { if (!_subscribers.ContainsKey(typeof(TEvent))) _subscribers[typeof(TEvent)] = new List<Delegate>(); _subscribers[typeof(TEvent)].Add(handler); }

return new Unsubscriber(() => { lock (_lock) { if (_subscribers.TryGetValue(typeof(TEvent), out var list)) list.Remove(handler); }

अनुशंसाएँ