gpt4 book ai didi

delphi - 如何在 Spring for Delphi 中使用带有 Autowiring 功能的模拟?

转载 作者:行者123 更新时间:2023-12-03 15:52:32 25 4
gpt4 key购买 nike

如果我有这些接口(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');

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

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

关于delphi - 如何在 Spring for Delphi 中使用带有 Autowiring 功能的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com