我是依赖注入的忠实粉丝,并且在不允许动态分配的嵌入式项目中工作。我总是以这种方式在C ++中注入依赖项:
class MyCar : public ICar
{
private:
IEngine &engine;
public:
MyCar(IEngine _engine) : engine(_engine) { }
/* Some other methods */
};
在其他地方,我正在撰写应用程序:
// Composition Root
main()
{
// Create instances
MyEngine engine;
MyCar car( engine );
/* Other initializations and then while(1) */
}
我的团队中的某个人看到了此链接中的服务定位器示例(Service Locator on GameProgrammingPatterns,现在为所有实例写入定位器:
class EngineLocator
{
public:
static IEngine& getEngine() { return static MyEngine engine; }
};
class MyCar : public ICar
{
private:
IEngine &engine;
public:
MyCar(/* now empty */) : engine(EngineLocator::getEngine()) { }
/* Some other methods */
};
我认为从可维护性和测试的角度来看,这是一个糟糕的设计:
关于这种模式有不同的看法(例如M. Seemann(Dep.Injection in .NET),但也许这是一个在静态初始化的嵌入式环境中的有效方法。也许我误解了这个你觉得怎么样?