使用Spring4D时,我如何在调用GlobalContainer.Resolve时将字符串值作为参数传递,以便该字符串值在已解析的类构造函数中使用?
我想要解析映射到TWorker的IWorker类。 TWorker类在其构造函数中具有对ITool的依赖项以及一个用于工作程序名称的字符串。
我猜答案在可以作为GlobalContainer.Resolve参数给出的TValue数组中,但我不知道如何使用它。
我找到了这篇关于在调用GlobalContainer.Resolve时使用TParameterOverride作为参数的帖子,这可能有效,但是这个功能似乎在Spring4D的1.1版本中消失了。
我想避免在注册我的类型时调用InjectConstructor。
我需要帮助的部分是:
我想要解析映射到TWorker的IWorker类。 TWorker类在其构造函数中具有对ITool的依赖项以及一个用于工作程序名称的字符串。
我猜答案在可以作为GlobalContainer.Resolve参数给出的TValue数组中,但我不知道如何使用它。
我找到了这篇关于在调用GlobalContainer.Resolve时使用TParameterOverride作为参数的帖子,这可能有效,但是这个功能似乎在Spring4D的1.1版本中消失了。
我想避免在注册我的类型时调用InjectConstructor。
我需要帮助的部分是:
GlobalContainer.Resolve<IWorker>([{what do I put here?}]).Work;
这是我的一个小项目
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Spring.Container;
type
IWorker = interface
['{2BBD7E9C-4806-4F01-9B05-9E9DD928D21D}']
procedure Work;
end;
ITool = interface
['{F962209D-4BC3-41C4-9089-0A874632ED1A}']
procedure Use;
end;
TWorker = class(TInterfacedObject, IWorker)
private
FTool: ITool;
FName: string;
procedure Work;
public
constructor Create(tool: ITool; name: string);
end;
THammer = class(TInterfacedObject, ITool)
private
procedure Use;
end;
{ TWorker }
constructor TWorker.Create(tool: ITool; name: string);
begin
FTool := tool;
FName := name;
end;
procedure TWorker.Work;
begin
Writeln(FName + ' is working');
FTool.Use;
end;
{ THammer }
procedure THammer.Use;
begin
Writeln('Using a hammer');
end;
begin
try
GlobalContainer.RegisterType<ITool, THammer>;
GlobalContainer.RegisterType<IWorker, TWorker>; // TWorker constructor = Create(tool: ITool; name: string);
GlobalContainer.Build;
GlobalContainer.Resolve<IWorker>([{what do I put here?}]).Work;
GlobalContainer.Resolve<IWorker>(['THammer.Create', 'Bob']).Work; //--> 'Unsatisfied constructor on type: TWorker'
GlobalContainer.Resolve<IWorker>([THammer.Create, 'Bob']).Work; //--> Access violation
GlobalContainer.Resolve<IWorker>([nil, 'Bob']).Work; //--> 'Unsatisfied constructor on type: TWorker'
Readln;
except
on E: Exception do
begin
Writeln(E.ClassName, ': ', E.Message);
Readln;
end;
end;
end.
需要帮助,谢谢!