Service and Dependency Injection in ASP.NET Core

ASP.NET Core में सर्विस (Service) और डिपेंडेंसी इंजेक्शन (Dependency Injection)

ASP.NET Core एक शक्तिशाली फ्रेमवर्क है जो आधुनिक वेब एप्लीकेशन बनाने के लिए कई सुविधाएँ प्रदान करता है। इन सुविधाओं में से एक महत्वपूर्ण अवधारणा सर्विसेज (Services) और डिपेंडेंसी इंजेक्शन (Dependency Injection - DI) है। यह लेख आपको इन दोनों अवधारणाओं को गहराई से समझने में मदद करेगा.

सर्विस क्या होती है?

सबसे पहले समझते हैं कि सर्विस क्या होती है। देखिए, सर्विस साधारणतः एक क्लास ही होती है जिसके भीतर मेथड्स (Methods), प्रॉपर्टीज (Properties) और दूसरे मेंबर्स (Members) जैसे इवेंट्स (Events) आदि हो सकते हैं। एक सामान्य क्लास को सर्विस तब माना जाता है जब उस क्लास का उपयोग किसी दूसरे क्लास के द्वारा किया जाता है। इस प्रकार, जिस क्लास का उपयोग दूसरे क्लास के द्वारा किया जाता है, उसे सर्विस (Service) कहते हैं, जबकि जो क्लास सर्विस का उपयोग करता है उसे सर्विस उपभोक्ता क्लास (Service Consumer Class) कहते हैं.

ASP.NET Core एप्लीकेशन के संदर्भ में, विभिन्न प्रकार की सर्विस का उपयोग एप्लीकेशन के भीतर किया जाता है। ASP.NET Core एप्लीकेशन के भीतर सर्विस दो प्रकार की उपलब्ध होती हैं:

  • 1. पहले से उपलब्ध सर्विस: ये वो सर्विसेज होती हैं जो किसी NuGet पैकेज के द्वारा उपलब्ध कराई जाती हैं.
  • 2. डेवलपर द्वारा निर्मित सर्विस: ये वो सर्विसेज होती हैं जिनका निर्माण स्वयं डेवलपर के द्वारा किया जाता है.

सर्विस का उपयोग

प्रश्न है कि ASP.NET Core एप्लीकेशन के भीतर पैकेज के द्वारा उपलब्ध कराई जाने वाली सर्विस को किस प्रकार उपयोग किया जाता है? इसका उत्तर यह है कि ASP.NET Core एप्लीकेशन के भीतर डिपेंडेंसी इंजेक्शन से संबंधित पैकेज होता है जिसके द्वारा इंटरफ़ेस (Interface) उपलब्ध कराया जाता है। किसी सर्विस को संग्रह करके रखने के लिए IServiceCollection नामक इंटरफ़ेस का उपयोग करते हैं। इसका अर्थ यह है कि कोई भी क्लास जो इस इंटरफेस को इम्प्लीमेंट करता है, उसके द्वारा ही इंजेक्ट किए गए सर्विस को संग्रहित किया जाता है.

सर्विस को संग्रह करने की अवधि (Lifetime)

आमतौर पर सर्विस को संग्रह करने के लिए दो बातों का ध्यान रखना पड़ता है:

  1. सर्विस कितने कालखंड के लिए संग्रह करके रखना है? इसका अर्थ यह है कि जब एप्लीकेशन के भीतर सर्विस का उपयोग किया जाएगा तो सर्विस कितने कालखंड तक जीवित रहेगा.
  • हो सकता है कि प्रत्येक रिक्वेस्ट (Request) के बाद सर्विस का निर्माण हो और रिक्वेस्ट के बाद उसका अंत हो जाए। (यह ट्रांजिएंट (Transient) सर्विस का उदाहरण है.)
  • दूसरी संभावना यह है कि जब-जब सर्विस की जरूरत हो तो सर्विस की मांग करके सर्विस का निर्माण कर लिया जाए और जब जरूरत ना हो तो उसको नष्ट कर दिया जाए। (यह स्कोपड (Scoped) सर्विस का उदाहरण है, आमतौर पर प्रति HTTP रिक्वेस्ट.)
  • तीसरी संभावना यह है कि एक सर्विस का निर्माण एप्लीकेशन के जीवन काल में एक ही बार किया जाए और पूरे एप्लीकेशन के जीवन काल तक वह सर्विस जीवित रहे। (यह सिंगलटन (Singleton) सर्विस का उदाहरण है.)

इस तरह हम देख रहे हैं कि सर्विस का उपयोग करने के लिए उसके निर्माण की अवधि एक महत्वपूर्ण घटक है.

कंटेनर में सर्विस का रजिस्ट्रेशन

इसके बाद विचार करने वाली बात है कि सर्विस को सर्विस कलेक्शन (IServiceCollection) के भीतर रखने के लिए क्या उपाय है? अर्थात सर्विस कलेक्शन में सर्विस को कैसे रजिस्टर करें?

किसी भी सर्विस को सर्विस कलेक्शन (IServiceCollection) के भीतर रखने के लिए पैकेज के द्वारा एक्सटेंशन मेथड (Extension Method) प्रदान किया जाता है, जिसका उपयोग करके हम किसी सर्विस को एक निश्चित कालखंड (Lifetime) के लिए संग्रहित करके रख सकते हैं। संग्रहित करके रखे गए सर्विस को सर्विस उपभोक्ता क्लास (जो IServiceProvider से इम्प्लीमेंटेड हो) के भीतर कंस्ट्रक्टर (Constructor) के माध्यम से इंजेक्ट किया जा सकता है.

जब कोई सर्विस, सर्विस कलेक्शन के भीतर रख दिया जाता है और जब सर्विस की मांग होती है तो उस सर्विस के ऑब्जेक्ट का निर्माण सर्विस प्रदाता क्लास (Service Provider Class) या इंटरफेस जैसे IServiceProvider के द्वारा किया जाता है.

डिपेंडेंसी इंजेक्शन कंटेनर

देखिए, ASP.NET Core एप्लीकेशन के भीतर इन सारी प्रक्रियाओं के लिए पहले से ही बना बनाया डिपेंडेंसी इंजेक्शन का कंटेनर (Dependency Injection Container) उपलब्ध है। यदि आप अपना खुद का कंटेनर बनाना चाहें तो बना सकते हैं या किसी थर्ड पार्टी कंटेनर का उपयोग कर सकते हैं। आमतौर पर माइक्रोसॉफ्ट के द्वारा प्रदान किए गए डिपेंडेंसी इंजेक्शन कंटेनर का ही उपयोग एप्लीकेशन के भीतर किया जाता है.

इस कॉन्सेप्ट को और भी बेहतर तरीके से समझने के लिए हम डिपेंडेंसी इंजेक्शन के कॉन्सेप्ट को किसी कंसोल एप्लीकेशन (Console Application) के भीतर प्रयोग करके समझ सकते हैं। इसके लिए हम एक साधारण कंसोल एप्लीकेशन बनाते हैं.

सवाल है कि कंसोल एप्लीकेशन के भीतर ASP.NET Core एप्लीकेशन की भांति बना बनाया डिपेंडेंसी इंजेक्शन का कंटेनर या सिस्टम उपलब्ध नहीं होता है। इसके लिए हमें अपने कंसोल एप्लीकेशन के भीतर माइक्रोसॉफ्ट के डिपेंडेंसी इंजेक्शन पैकेज को इंस्टॉल करना होगा. इस कार्य को हम आगे प्रोजेक्ट बना कर देखते हैं. डिपेंडेंसी इंजेक्शन सिस्टम को कंसोल एप्लीकेशन के भीतर विकसित करने के लिए आपको निम्नलिखित पैकेज को कंसोल एप्लीकेशन के भीतर इंस्टॉल करना होगा:

Microsoft.Extensions.DependencyInjection

अब जैसा कि हमने डिपेंडेंसी इंजेक्शन कंटेनर को अपने एप्लीकेशन में स्थापित कर लिया है, तो इसके बाद हम एक साधारण सा क्लास बनाएंगे और उसको एक सर्विस के रूप में दूसरे क्लास के भीतर कंस्ट्रक्टर इंजेक्शन के माध्यम से उपयोग करेंगे। इसका अर्थ यह होगा कि हमें सर्विस के ऑब्जेक्ट को खुद निर्मित नहीं करना होगा. एक बार जब सर्विस को कंटेनर के भीतर रजिस्टर कर दिया जाएगा तो सर्विस प्रोवाइडर सर्विस कलेक्शन में से उस सर्विस क्लास को ढूंढ कर उस सर्विस का ऑब्जेक्ट बनाएगा और कंस्ट्रक्टर के माध्यम से सर्विस उपभोक्ता क्लास के भीतर इंजेक्ट कर देगा.

आइए, अब समझते हैं कि कंसोल एप्लीकेशन (Console Application) में डिपेंडेंसी इंजेक्शन (Dependency Injection) का उपयोग कैसे किया जा सकता है। यह आपको कॉन्सेप्ट को और भी बेहतर तरीके से समझने में मदद करेगा.

ASP.NET Core और कंसोल एप्लीकेशन में सर्विस कलेक्शन प्राप्त करना

देखिए, ASP.NET Core एप्लीकेशन के भीतर WebApplicationBuilder नाम का क्लास होता है जिसके Services प्रॉपर्टी के द्वारा हम सर्विस कलेक्शन को प्राप्त करते हैं, जो इस प्रकार है:

var builder = WebApplication.CreateBuilder();
var services = builder.Services;

लेकिन कंसोल एप्लीकेशन के भीतर ASP.NET Core के WebApplicationBuilder की तरह कार्य नहीं कर सकते। हमें विचार करना होगा कि सर्विस कलेक्शन की प्राप्ति या निर्माण कंसोल एप्लीकेशन के भीतर कैसे किया जा सकता है। तो इसके लिए हमें यह बात समझना है कि चाहे ASP.NET Core एप्लीकेशन हो या कंसोल एप्लीकेशन, दोनों के भीतर जेनेरिक होस्ट (Generic Host) का कॉन्सेप्ट होता है। जेनेरिक होस्ट की मदद से हम इस कार्य को संपन्न करते हैं। इस बात को हम कंसोल एप्लीकेशन में डिपेंडेंसी इंजेक्शन प्रोजेक्ट बना के स्पष्ट करेंगे.

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Differences between in-process and out-of-process hosting models

Web Fundamental Concepts in Hindi for Beginners - FAQs with their Answers Part-1

Introduction to ASP.NET Core and Web Frameworks