11

उदाहरण:क्या आधार वर्ग में संपत्ति इंजेक्शन का उपयोग करना उचित है जब निर्भरता केवल बेस क्लास में आवश्यक है?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

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

लेकिन जब आपको केवल अपनी बेस क्लास निर्भरता की आवश्यकता होती है तो आपको क्या करना चाहिए?

जब आप कन्स्ट्रक्टर इंजेक्शन का उपयोग करेंगे, तो आप मेरी राय में सभी व्युत्पन्न कक्षाओं को प्रदूषित करेंगे।

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

यह एक आधार वर्ग में संपत्ति इंजेक्शन उपयोग करने के लिए जब एक निर्भरता केवल आधार वर्ग में आवश्यक है approperiate है?

उत्तर

12

आप व्युत्पन्न कक्षा को प्रदूषित नहीं कर रहे हैं। आप स्पष्ट रूप से उपभोक्ता को बता रहे हैं कि यह वर्ग इस निर्भरता के बिना काम नहीं कर सकता है।

यदि बेस क्लास को इस निर्भरता की उचित आवश्यकता के लिए इस निर्भरता की आवश्यकता होती है, क्योंकि व्युत्पन्न वर्ग इस बेस क्लास से निकला है, तो यह निश्चित रूप से इस निर्भरता की भी आवश्यकता है। तो दूसरा उदाहरण सही तरीका है। आपको किसी ऐसी निर्भरता के लिए संपत्ति इंजेक्शन का उपयोग नहीं करना चाहिए जो एक आवश्यक निर्भरता है।

+0

मुझे आपकी बात दिखाई देती है, लेकिन मुझे जो समस्या मिलेगी वह बहुत सारे कन्स्ट्रक्टर पैरामीटर हैं। मुद्दा यह है कि व्युत्पन्न कक्षाएं आधार वर्ग की बजाय निर्भरता पर सीधे बात नहीं कर रही हैं। इसलिए मैं निर्भरता के लिए एक निर्भरता और अप्रत्यक्ष कॉल पर प्रत्यक्ष कॉल के बीच अंतर करूँगा। – Rookian

+0

@ रुकेयन, यदि आप ऐसी स्थिति में आते हैं जहां आपके पास एकाधिक कन्स्ट्रक्टर पैरामीटर हैं, तो आप उन सेवाओं को बनाने पर विचार कर सकते हैं जो उन निर्भरताओं को एकत्रित करेंगे और फिर केवल कन्स्ट्रक्टर में सेवा को इंजेक्ट करेंगे। –

+5

+1 विरासत पर रचना का पक्ष लें। यदि यह बहुत सारे कन्स्ट्रक्टर पैरामीटर के साथ एक समस्या बन जाता है, तो अपनी विरासत रणनीति को दोष दें, कन्स्ट्रक्टर इंजेक्शन नहीं। –

3

दरअसल आपकी व्युत्पन्न कक्षा बेस क्लास है। कहीं और कोई अन्य वस्तु नहीं है। जब आप आधार निर्माता को कुछ पास करते हैं, तो आप वास्तव में एक ही वस्तु को प्रारंभ करते हैं। और यह ग्राहकों को दिखाता है कि आपके उदाहरण पर निर्भर करता है: उपयोगकर्ता भंडार, और काम की इकाई:

एक उदाहरण है, जो दो बातों पर निर्भर करता है। बेस क्लास कन्स्ट्रक्टर को कॉल करें बस अपने व्युत्पन्न कक्षाओं से प्रारंभिक डुप्लिकेशन को हटा दें।

संबंधित मुद्दे

 संबंधित मुद्दे