मैं निर्भरता इंजेक्शन सीखने की कोशिश कर रहा हूं और एक समस्या में आया है, जब इकाई परीक्षण का परीक्षण करती है।निर्भरता इंजेक्शन समाधान और इकाई परीक्षण
मैं एक सांत्वना आवेदन लिख रहा हूँ और कंटेनर बनाया है और मुख्य() में आरंभ नहीं हो जाता, यह उपलब्ध है के रूप में Program.Container
में एक get-property
, इसलिए अपने आवेदन में कहीं भी मैं Program.Container.Resolve<..>()
कॉल कर सकते हैं। मैं का उपयोग
ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>();
serviceValidator.VerifyVersion();
यह Program.Container.Resolve
करने के लिए कॉल है कि मुझे इकाई परीक्षण में समस्याओं का कारण बनता है के रूप में यह नहीं है
public class ServiceValidator
{
private readonly IConfiguration _configuration;
private readonly IService _service;
public ServiceValidator(IConfiguration configuration, IService service)
{
_configuration = configuration;
_service = service;
}
अन्य वर्ग में:
मैं इस तरह एक ServiceValidator वर्ग है सेटअप किया गया है।
क्या यह एक बुरा अभ्यास है, कंटेनर पर हल करने के लिए? मैं Main()
में ServiceValidator इंस्टेंस बना सकता हूं और ऑब्जेक्ट को पास कर सकता हूं, लेकिन यह बेवकूफ लगता है क्योंकि इससे ऑब्जेक्ट्स के लिए बहुत से पैरामीटर होंगे जो अगली विधि के आसपास पास हो जाते हैं।
तो मुझे लगता है कि कॉल को कक्षा में हल करने के लिए स्वीकार्य है, लेकिन फिर कंटेनर को इकाई परीक्षण के लिए कॉन्फ़िगर किया जाना चाहिए। मुझे यह कैसे करना चाहिए, क्या मुझे कंटेनर को प्रोग्राम क्लास की तुलना में किसी अन्य स्थान पर ले जाना चाहिए? आप क्या सुझाव देंगे?
अगर यह मायने रखती है, मैं एकता उपयोग कर रहा हूँ और सी #
धन्यवाद :-)
> जब आप निर्भरता इंजेक्शन का उपयोग सभी तरह से करते हैं, > तो आपको ऑब्जेक्ट्स पर बहुत से पैरामीटर पास करने की आवश्यकता नहीं होगी। मैंने कभी भी सभी वर्गों के लिए DI करने पर विचार नहीं किया। मैं सिर्फ कक्षाओं के लिए DI करना चाहता था जो बाहरी सामान का उपयोग करता है, जैसे वेब सेवाएं, डेटाबेस, शायद कॉन्फ़िगरेशन। यदि मैं आपको सही समझता हूं, तो आप फ्रेमवर्क कक्षाओं के अलावा कुछ भी हल या नया नहीं कहेंगे? आपके उत्तर के लिए धन्यवाद :-) – Karsten
एक और बात के बारे में सोचने के लिए आया था। क्या इसका मतलब यह है कि सभी वस्तुओं को सामने लाया जाता है, वास्तव में उनकी आवश्यकता होने से काफी समय पहले, शायद उन्हें भी जरूरी नहीं है? – Karsten
DI का उपयोग करते समय, आप अपने अनुप्रयोग की रूट ऑब्जेक्ट को DI कंटेनर से प्राप्त करके एप्लिकेशन को बूटस्ट्रैप करते हैं, और इसके बाद आप कंटेनर को सीधे एक्सेस नहीं करते हैं। http://docs.google.com/Doc?id=dd2fhx4z_5df5hw8#xefn ऑब्जेक्ट्स बनाए जाएंगे जब कुछ ऑब्जेक्ट जो उन्हें निर्भरता के रूप में बनाए जाते हैं। आम तौर पर, एक ही जीवन चक्र के साथ सभी वस्तुओं को एक ही समय में तत्काल किया जाता है। अगर कुछ वस्तुओं के पास एक अलग जीवन चक्र गुंजाइश है, तो आप उन्हें सही समय पर तुरंत चालू करने के लिए एक कारखाने इंजेक्ट कर सकते हैं। –