我正在尝试使用 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
我希望工厂解决TMyComponent1
当AServiceName = 'Service1'
, TMyComponent2
当AServiceName = 'Service2'
等
我怎样才能实现这个目标?
最佳答案
您目前不能。所有参数都传递到解析器,用作潜在的构造函数参数。
能够注释工厂接口(interface)的参数以将其用作请求的服务类型可能值得提出功能请求。
但是这不会很快实现,因为 1.3 我计划对系统进行一些更改,这将使上下文注入(inject)和注册成为可能。这样不仅可以通过名称来确定已解析的服务,还可以通过提供的任何可能的元信息来确定已解析的服务。
关于delphi - Spring4d - 具有服务名称的自动工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113772/