2

我正在尝试使用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

我希望工厂解决TMyComponent1when AServiceName = 'Service1'TMyComponent2whenAServiceName = 'Service2'等。

我怎样才能做到这一点?

4

1 回答 1

3

你目前不能。参数都通过解析器被用作潜在的构造函数参数。

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

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

于 2018-03-05T16:20:05.623 回答