我已经看到一些建议在代码中使用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 ++示例)
尽管我同意通过删除依赖项构造函数参数来简化类的接口,但出于某些原因,我认为治愈的方法比疾病的方法还差。首先,这对我来说是个很大的问题,这使您的程序依赖于外部配置文件。如果您需要单个二进制部署,则无法使用这些类型的容器。第二个问题是,API现在是弱类型,更糟糕的是,是字符串类型的。证据(在此假设示例中)是IoC容器的字符串参数,并对结果进行强制转换。
所以..使用这些容器还有其他好处吗?或者我只是不同意那些推荐的容器?
1
示例代码看起来像是一个非常糟糕的IoC实现示例。我只熟悉C#,但是肯定有办法在C ++中进行构造函数注入和程序化配置吗?
—
rmac 2011年