Tôi đã thấy một số khuyến nghị sử dụng các bộ chứa IoC trong mã. Động lực rất đơn giản. Lấy mã phụ thuộc sau đây được tiêm:
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
}
Vào:
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>
(Trên đây là ví dụ C ++ giả thuyết)
Mặc dù tôi đồng ý rằng điều này đơn giản hóa giao diện của lớp bằng cách loại bỏ tham số hàm tạo phụ thuộc, tôi nghĩ rằng phương pháp chữa trị còn tệ hơn bệnh vì một vài lý do. Đầu tiên, và đây là một cái lớn đối với tôi, điều này làm cho chương trình của bạn phụ thuộc vào một tệp cấu hình bên ngoài. Nếu bạn cần triển khai nhị phân đơn, bạn chỉ đơn giản là không thể sử dụng các loại container này. Vấn đề thứ hai là API bây giờ yếu và tệ hơn, được gõ một cách nghiêm ngặt . Bằng chứng (trong ví dụ giả thuyết này) là đối số chuỗi cho bộ chứa IoC và kết quả trên kết quả.
Vì vậy, có những lợi ích khác của việc sử dụng các loại container này hay tôi chỉ không đồng ý với những người giới thiệu các container?