मैंने हाल ही में [FromServices] विशेषता की खोज की, जो .Net Core के पहले संस्करण से ही एक हिस्सा रही है।
[FromServices] विशेषता Asp.Net Core नियंत्रकों में विधि स्तर की निर्भरता इंजेक्शन की अनुमति देती है।
यहाँ एक उदाहरण है:
public class UserController : Controller
{
private readonly IApplicationSettings _applicationSettings;
public UserController(IApplicationSettings applicationSettings)
{
_applicationSettings = applicationSettings;
}
public IActionResult Get([FromService]IUserRepository userRepository, int userId)
{
//Do magic
}
}
निर्माता इंजेक्शन पर विधि इंजेक्शन का उपयोग क्यों करें? सामान्य व्याख्या यह है कि जब एक विधि को निर्भरताओं की आवश्यकता होती है और इसका उपयोग कहीं और नहीं किया जाता है, तो यह [FromService] विशेषता का उपयोग करने के लिए एक उम्मीदवार है।
Steven ने StackOverflow से [FromService] विशेषता का उपयोग करने के विरुद्ध एक उत्तर पोस्ट किया:
मेरे लिए, नियंत्रक कार्यों में इस प्रकार की विधि इंजेक्शन का उपयोग एक बुरा विचार है, क्योंकि:
– ऐसी
[FromServices]विशेषता आसानी से भूल सकती है, और आप केवल तभी पता लगाएंगे जब कार्य को आमंत्रित किया जाएगा (इसके बजाय आवेदन स्टार्ट-अप पर पता लगाने के बजाय, जहां आप आवेदन के कॉन्फ़िगरेशन को सत्यापित कर सकते हैं)– निर्माता इंजेक्शन से दूर जाने की आवश्यकता प्रदर्शन कारणों के लिए एक स्पष्ट संकेत है कि इंजेक्ट किए गए घटक बनाने के लिए बहुत भारी हैं, जबकि इंजेक्शन निर्माता सरल होने चाहिए, और घटक निर्माण, इसलिए, बहुत हल्का होना चाहिए।
– निर्माता इंजेक्शन से दूर जाने की आवश्यकता निर्माताओं को बहुत बड़ा होने से रोकने के लिए एक संकेत है कि आपकी कक्षाओं में बहुत अधिक निर्भरताएं हैं और बहुत जटिल हो रही हैं। दूसरे शब्दों में, कई निर्भरताएं होना एक संकेत है कि वर्ग एकल जिम्मेदारी सिद्धांत का उल्लंघन कर रहा है। तथ्य यह है कि आपके नियंत्रक कार्यों को आसानी से विभिन्न कक्षाओं में विभाजित किया जा सकता है, यह प्रमाण है कि ऐसा नियंत्रक बहुत सुसंगत नहीं है और, इसलिए, एक SRP उल्लंघन का संकेत है।
तो विधि इंजेक्शन के उपयोग के साथ मूल समस्या को छिपाने के बजाय, मैं यहां निर्माता इंजेक्शन को एकमात्र इंजेक्शन पैटर्न के रूप में उपयोग करने की सलाह देता हूं और अपने नियंत्रकों को छोटा बनाता हूं। इसका मतलब यह हो सकता है, हालांकि, आपकी रूटिंग योजना आपकी कक्षा संरचना से अलग हो जाती है, लेकिन यह पूरी तरह से ठीक है, और ASP.NET Core द्वारा पूरी तरह से समर्थित है।
परीक्षण क्षमता के दृष्टिकोण से, वैसे, यह वास्तव में महत्वपूर्ण नहीं होना चाहिए कि कभी-कभी एक निर्भरता न हो जो आवश्यक न हो। ऐसी प्रभावी परीक्षण पैटर्न हैं जो इस समस्या को ठीक करती हैं।
मैं Steven से सहमत हूं; यदि आपको अपने नियंत्रक से अपनी निर्भरताओं को विधि में स्थानांतरित करने की आवश्यकता है क्योंकि वर्ग बहुत अधिक निर्भरताओं का निर्माण कर रहा है, तो यह नियंत्रक को तोड़ने का समय है। आप लगभग निश्चित रूप से SRP का उल्लंघन कर रहे हैं।
विधि इंजेक्शन के साथ एकमात्र उपयोग मामला मैं देखता हूं देर से बाध्यकारी है जब एक निर्भरता नियंत्रक निर्माण पर तैयार नहीं है। अन्यथा, निर्माता इंजेक्शन का उपयोग करना बेहतर है।
मैं ऐसा इसलिए कहता हूं क्योंकि निर्माता इंजेक्शन के साथ वर्ग निर्माण पर जानता है कि क्या निर्भरताएं उपलब्ध हैं। विधि इंजेक्शन के साथ, यह मामला नहीं है, यह ज्ञात नहीं है कि निर्भरताएं तब तक उपलब्ध हैं जब तक विधि को कॉल नहीं किया जाता है।
लेखक: Chuck Conway एक AI इंजीनियर हैं जिनके पास सॉफ्टवेयर इंजीनियरिंग का लगभग 30 साल का अनुभव है। वह व्यावहारिक AI सिस्टम बनाते हैं—कंटेंट पाइपलाइन, इंफ्रास्ट्रक्चर एजेंट, और ऐसे टूल जो वास्तविक समस्याओं को हल करते हैं—और अपनी सीख को साझा करते हैं। सोशल मीडिया पर उनसे जुड़ें: X (@chuckconway) या YouTube और SubStack पर उनसे मिलें।