3

如果我有这些接口:

ISequencer = interface;
IController = interface;

他们的实现(控制器需要通过构造器注入的 Sequencer):

TSequencer = class(TInterfacedObject, ISequencer)
end;

TController = class(TInterfacedObject, IController)
  constructor Create(Sequencer: ISequencer);
end;

我在全局容器中注册实现:

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>;
GlobalContainer.RegisterType<TController>.Implements<IController>;

GlobalContainer.Build;

最后,通过自动连接功能,我可以获得一个新的IController接口实例:

Controller := ServiceLocator.GetService<IController>;

这对于真正的应用程序代码来说是可以的。但在测试项目中我想模拟ISequencer. 根据测试,当我向容器请求实现时ISequencer,有时我需要真正的实现(TSequencer),而其他时候我需要一个模拟实现(如TSequencerMock)。我该怎么做这个开关?

4

1 回答 1

4

您可以为给定接口注册多个实现。然后你叫他们名字:

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>('real');
GlobalContainer.RegisterType<TController>.Implements<IController>('mock');

然后您可以根据需要按名称调用它们:

Controller := ServiceLocator.GetService<IController>('mock');

我在这里写了一篇关于如何做到这一点的文章:

http://www.nickhodges.com/post/Getting-Giddy-with-Dependency-Injection-and-Delphi-Spring-9-%E2%80%93-One-Interface-Many-Implementations.aspx

于 2013-02-07T16:59:45.430 回答