Eu já vi vários recomendar o uso de contêineres IoC no código. A motivação é simples. Pegue o seguinte código injetado de dependência:
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
}
Para dentro:
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>
(O exemplo acima é hipotético em C ++, é claro)
Embora eu concorde que isso simplifique a interface da classe removendo o parâmetro construtor de dependência, acho que a cura é pior que a doença por alguns motivos. Primeiro, e este é um grande problema para mim, isso torna seu programa dependente de um arquivo de configuração externo. Se você precisar de implantação binária única, simplesmente não poderá usar esses tipos de contêineres. A segunda questão é que a API agora está fraca e pior, tipicamente estrita . A evidência (neste exemplo hipotético) é o argumento de string para o contêiner de IoC e o elenco no resultado.
Então .. existem outros benefícios do uso desses tipos de contêineres ou apenas discordo dos que os recomendam?