
मैंने हाल ही में [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]
एट्रिब्यूट का उपयोग करने का उम्मीदवार है।
StackOverflow से Steven ने [FromService]
एट्रिब्यूट के उपयोग के विरुद्ध एक उत्तर पोस्ट किया है:
मेरे लिए, कंट्रोलर एक्शन्स में इस प्रकार के मेथड इंजेक्शन का उपयोग एक बुरा विचार है, क्योंकि:
– ऐसे
[FromServices]
एट्रिब्यूट को आसानी से भुलाया जा सकता है, और आपको केवल तभी पता चलेगा जब एक्शन को इनवोक किया जाएगा (एप्लिकेशन स्टार्ट-अप पर पता चलने के बजाय, जहाँ आप एप्लिकेशन की कॉन्फ़िगरेशन को वेरिफाई कर सकते हैं)– परफॉर्मेंस कारणों से कंस्ट्रक्टर इंजेक्शन से दूर जाने की आवश्यकता इस बात का स्पष्ट संकेत है कि इंजेक्ट किए गए कंपोनेंट्स बनाने के लिए बहुत भारी हैं, जबकि इंजेक्शन कंस्ट्रक्टर्स सरल होने चाहिए, और कंपोनेंट निर्माण, इसलिए, बहुत हल्का होना चाहिए।
– कंस्ट्रक्टर्स को बहुत बड़ा होने से रोकने के लिए कंस्ट्रक्टर इंजेक्शन से दूर जाने की आवश्यकता इस बात का संकेत है कि आपकी क्लासेस में बहुत सारी डिपेंडेंसी हैं और वे बहुत जटिल हो रही हैं। दूसरे शब्दों में, कई डिपेंडेंसी होना इस बात का संकेत है कि क्लास Single Responsibility Principle का उल्लंघन करती है। यह तथ्य कि आपके कंट्रोलर एक्शन्स को आसानी से विभिन्न क्लासेस में विभाजित किया जा सकता है, इस बात का प्रमाण है कि ऐसा कंट्रोलर बहुत सामंजस्यपूर्ण नहीं है और इसलिए, SRP उल्लंघन का संकेत है।
इसलिए मेथड इंजेक्शन के उपयोग से मूल समस्या को छुपाने के बजाय, मैं यहाँ एकमात्र इंजेक्शन पैटर्न के रूप में कंस्ट्रक्टर इंजेक्शन के उपयोग की सलाह देता हूँ और अपने कंट्रोलर्स को छोटा बनाता हूँ। हालांकि, इसका मतलब यह हो सकता है कि आपकी रूटिंग स्कीम आपकी क्लास संरचना से अलग हो जाए, लेकिन यह बिल्कुल ठीक है, और ASP.NET Core द्वारा पूरी तरह से समर्थित है।
टेस्टेबिलिटी के दृष्टिकोण से, वैसे, यह वास्तव में मायने नहीं रखना चाहिए कि कभी-कभी कोई डिपेंडेंसी है जिसकी आवश्यकता नहीं है। ऐसे प्रभावी टेस्ट पैटर्न हैं जो इस समस्या को ठीक करते हैं।
मैं Steven से सहमत हूँ; यदि आपको अपनी डिपेंडेंसी को अपने कंट्रोलर से मेथड में स्थानांतरित करने की आवश्यकता है क्योंकि क्लास बहुत सारी डिपेंडेंसी का निर्माण कर रही है, तो कंट्रोलर को तोड़ने का समय आ गया है। आप लगभग निश्चित रूप से SRP का उल्लंघन कर रहे हैं।
मेथड इंजेक्शन के साथ मैं जो एकमात्र उपयोग केस देखता हूँ वह है लेट-बाइंडिंग जब कोई डिपेंडेंसी कंट्रोलर निर्माण के समय तैयार नहीं होती है। अन्यथा, कंस्ट्रक्टर इंजेक्शन का उपयोग करना बेहतर है।
मैं यह इसलिए कहता हूँ क्योंकि कंस्ट्रक्टर इंजेक्शन के साथ क्लास निर्माण के समय जानती है कि डिपेंडेंसी उपलब्ध हैं या नहीं। मेथड इंजेक्शन के साथ, यह स्थिति नहीं है, यह तब तक ज्ञात नहीं होता कि डिपेंडेंसी उपलब्ध हैं या नहीं जब तक कि मेथड को कॉल नहीं किया जाता।
लेखक: चक कॉनवे सॉफ्टवेयर इंजीनियरिंग और जेनेरेटिव AI में विशेषज्ञता रखते हैं। उनसे सोशल मीडिया पर जुड़ें: X (@chuckconway) या उन्हें YouTube पर देखें।