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); } पुस्तकालय में भी
PHP कार्य अनुसूचक: cron कार्यों और Task Scheduler के लिए पूर्ण मार्गदर्शिका
prometheus/client_golang Go: पूर्ण गाइड उदाहरणों के साथ
SwiftyJSON Swift: पूरी गाइड उदाहरणों के साथ
TBB (Intel Threading Building Blocks) C++: पूरी गाइड उदाहरणों के साथ
Swift अनुप्रयोगों का कॉन्फ़िगरेशन: SwiftyConfig लाइब्रेरी