Ich habe mehrere empfohlene Verwendung von IoC-Containern im Code gesehen. Die Motivation ist einfach. Nehmen Sie den folgenden in Abhängigkeit injizierten Code:
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
}
In:
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>
(Das obige ist natürlich ein hypothetisches C ++ - Beispiel)
Ich stimme zu, dass dies die Schnittstelle der Klasse vereinfacht, indem der Parameter für den Abhängigkeitskonstruktor entfernt wird. Ich denke jedoch, dass die Heilung aus mehreren Gründen schlechter ist als die Krankheit. Erstens, und dies ist für mich sehr wichtig, macht dies Ihr Programm von einer externen Konfigurationsdatei abhängig. Wenn Sie eine einzelne Binärbereitstellung benötigen, können Sie diese Art von Containern einfach nicht verwenden. Das zweite Problem ist, dass die API jetzt schwach und schlechter ist und streng getippt ist. Der Beweis (in diesem hypothetischen Beispiel) ist das Zeichenfolgenargument für den IoC-Container und die Besetzung des Ergebnisses.
Gibt es also noch andere Vorteile bei der Verwendung dieser Art von Behältern oder stimme ich denjenigen, die die Behälter empfehlen, einfach nicht zu?