मैंने कोड में IoC कंटेनरों के उपयोग की कई सिफारिशें देखी हैं। प्रेरणा सरल है। निम्नलिखित निर्भरता इंजेक्शन कोड ले लो:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest(
std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
) : d_(d)
{
}
};
TEST(UnitUnderTest, Example)
{
std::auto_ptr<Dependency> dep(new MockDependency);
UnitUnderTest uut(dep);
//Test here
}
में:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest()
{
d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
}
};
TEST(UnitUnderTest, Example)
{
UnitUnderTest uut;
//Test here
}
//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>
//Config for IOC container for testing
<Dependency>MockDependency</Dependency>
(उपरोक्त काल्पनिक C ++ का उदाहरण है)
जबकि मैं मानता हूं कि यह निर्भरता कंस्ट्रक्टर पैरामीटर को हटाकर कक्षा के इंटरफ़ेस को सरल करता है, मुझे लगता है कि बीमारी कुछ कारणों से बीमारी से भी बदतर है। सबसे पहले, और यह मेरे लिए एक बड़ा है, यह आपके प्रोग्राम को बाहरी कॉन्फ़िगरेशन फ़ाइल पर निर्भर करता है। यदि आपको एकल बाइनरी तैनाती की आवश्यकता है, तो आप इस प्रकार के कंटेनरों का उपयोग नहीं कर सकते। दूसरा मुद्दा यह है कि एपीआई अब कमजोर और बदतर है, कड़ाई से टाइप किया गया है। साक्ष्य (इस काल्पनिक उदाहरण में) IoC कंटेनर का स्ट्रिंग तर्क है, और परिणाम पर कास्ट।
तो .. क्या इस प्रकार के कंटेनरों का उपयोग करने के अन्य लाभ हैं या क्या मैं कंटेनर की सिफारिश करने वालों से असहमत हूं?