コードで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 ++の例です)
依存関係コンストラクターパラメーターを削除することにより、クラスのインターフェイスが単純化されることに同意しますが、いくつかの理由により、治療法は病気よりも悪いと思います。まず、これは私にとって大きなものです。これにより、プログラムが外部構成ファイルに依存するようになります。単一のバイナリ展開が必要な場合、これらの種類のコンテナは使用できません。2番目の問題は、APIが弱く、ひどく、文字列型であるということです。(この仮想的な例の)証拠は、IoCコンテナーへの文字列引数と、結果へのキャストです。
だから..これらの種類のコンテナを使用することには他の利点がありますか、それともコンテナを推奨するものに同意しませんか?