如果我有这些接口(interface):
ISequencer = interface;
IController = interface;
它们的实现( Controller 需要通过构造函数注入(inject) 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;
最后,通过 Autowiring 功能,我可以获得 IController
接口(interface)的新实例:
Controller := ServiceLocator.GetService<IController>;
这对于真正的应用程序代码来说没问题。但在测试项目中我想模拟ISequencer
。根据测试,当我向容器请求 ISequencer
的实现时,有时我需要真正的实现 (TSequencer
),有时我需要模拟实现(例如 TSequencerMock
)。我该如何进行此切换?
最佳答案
您可以为给定接口(interface)注册多个实现。然后你可以叫他们的名字:
GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>('real');
GlobalContainer.RegisterType<TController>.Implements<IController>('mock');
然后您可以根据需要通过名称来调用它们:
Controller := ServiceLocator.GetService<IController>('mock');
我在这里写了一篇关于如何做到这一点的文章:
关于delphi - 如何在 Spring for Delphi 中使用带有 Autowiring 功能的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756493/