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

时间:2018-03-05 15:23:45

标签: 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'TMyComponent2等时解析AServiceName = 'Service2'

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

1 个答案:

答案 0 :(得分:1)

你目前无法做到。参数全部传递给用作潜在构造函数参数的解析器。

可能值得一个功能请求,以便能够注释工厂接口的参数,以将其用作请求的服务类型。

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