delphi - Spring4d - 具有服务名称的自动工厂

标签 delphi dependency-injection factory spring4d

我正在尝试使用 Spring4d 的自动虚拟工厂功能。不过,我希望能够通过 ServiceName我想在工厂内部解决Build()功能。像这样:AFactory.Build(AServiceName)

例如

TMyComponent1 = class(TInterfacedObject, IMyService)
public
  constructor Create(AArgument : TObject);
end;

TMyComponent2 = class(TInterfacedObject, IMyService)
public
  constructor Create(AArgument : TObject);
end;

TMyComponent3 = class(TInterfacedObject, IMyService)
public
  constructor Create(AArgument : TObject);
end;

// Registering components

AContainer.RegisterType<TMyComponent1, IMyService>('Service1');
AContainer.RegisterType<TMyComponent2, IMyService>('Service2');
AContainer.RegisterType<TMyComponent3, IMyService>('Service3');

// Factory interface

IMyFactory = class(IInvokable)
[Guid]
  function Build(AArgument : TObject; AServiceName : string) : IMyService;
end;

// Factory registration

AContainer.RegisterType<IMyFactory>.AsFactory(); 

// Use factory

AContainer.Resolve<IMyFactory>(AObject, 'Service1'); // Should resolve TMyComponent1

我希望工厂解决TMyComponent1AServiceName = 'Service1' , TMyComponent2AServiceName = 'Service2'

我怎样才能实现这个目标?

最佳答案

您目前不能。所有参数都传递到解析器,用作潜在的构造函数参数。

能够注释工厂接口(interface)的参数以将其用作请求的服务类型可能值得提出功能请求。

但是这不会很快实现,因为 1.3 我计划对系统进行一些更改,这将使上下文注入(inject)和注册成为可能。这样不仅可以通过名称来确定已解析的服务,还可以通过提供的任何可能的元信息来确定已解析的服务。

关于delphi - Spring4d - 具有服务名称的自动工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113772/

相关文章:

delphi - 如何使用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

c - 如何将c中的数据类型byte []转换为delphi?

c# - 在 UnityContainer 中注册类型以使用其他命名注册来解析构造函数参数

java - @Autowired 在 Spring 中失败

objective-c - 如何将类名作为参数传递给 cocoa 中的对象工厂?

delphi - 并行 ping 多个网络设备的最佳方法是什么?

android - Delphi 10.3.1 - Android 服务在 System.InitUnits 上挂起

java - 根据参数重用Guice中的Provide

java - 如何对在其 builder() 方法中使用静态单例工厂的构建器进行单元测试?

language-agnostic - 如果工厂返回的对象是静态的,它仍然被认为是工厂吗?