使用服务定位器初始化构造函数中的引用

时间:2014-06-04 14:42:38

标签: c++ constructor reference factory service-locator

我是依赖注入的忠实粉丝,并且在不允许动态分配的嵌入式项目中工作。我总是以这种方式在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 */
};

我认为从可维护性和测试的角度来看,这是一个糟糕的设计:

  • 实现现在取决于Locator和Interface Class IEngine。如果我想用模拟替换IEngine,我必须编辑其他定位器类或替换它。
  • 实现MyCar隐藏了它的依赖项(它有一个空构造函数,但依赖项仍然存在)
  • 在我的例子中,我有一个地方(组合根),我实例化所有类。使用服务定位器,创建将扩展到不同的类。
  • Locator类可能像全局变量一样被滥用
  • 此示例Locator中的Engine实例没有构造函数参数。如果有,那么引擎类必须使用其他定位器......我认为这很难理解和跟踪。

关于这种模式有不同的看法(例如M. Seemann(Dep.Injection in .NET),但也许这是一个在静态初始化的嵌入式环境中的有效方法。也许我误解了这个你觉得怎么样?

0 个答案:

没有答案