Delphi 如何从Spring4d中的ServiceLocator获取子接口实例?

Delphi 如何从Spring4d中的ServiceLocator获取子接口实例?,delphi,spring4d,Delphi,Spring4d,我是Spring4D框架的新手,请求帮助 我有下一个类和接口: ICommand = interface TCommand = class(TInterfacedObject, ICommand) IVecadCommand = interface(ICommand) TVecadCommand = class(TCommand, IVecadCommand) TVecadCommandJPG = class(TVecadCommand, IVecadCommand) TCommand

我是Spring4D框架的新手,请求帮助

我有下一个类和接口:

ICommand = interface

TCommand = class(TInterfacedObject, ICommand)

IVecadCommand = interface(ICommand)

TVecadCommand = class(TCommand, IVecadCommand)

TVecadCommandJPG = class(TVecadCommand, IVecadCommand)

TCommandDeckelJPG = class(TVecadCommandJPG, IVecadCommand)
然后我注册一个组件:

GlobalContainer.RegisterComponent<TCommandDeckelJPG>.Implements<IVecadCommand>('deckel_jpg');
为了避免出现例外情况,我这样做:

var
  i: Integer;
  com: IVecadCommand;
begin
  Result := nil;
  com := ServiceLocator.GetService<IVecadCommand>(actionName);
  com.setSession(designSession);
  Result := com;
end;
var
i:整数;
com:ivecad命令;
开始
结果:=无;
com:=ServiceLocator.GetService(actionName);
com.setSession(设计会话);
结果:=com;
结束;
那么一切都好了

重点是,在本例中,我必须使用it TContainer作为TCommand和继承类的存储库。所以我必须首先使用ServiceLocator

我应该如何避免异常并在TContainer中使用ICommand而不是IVecadCommand


谢谢。将很乐意提供更多详细信息。

您注册了
IVecadCommand
,但要求提供
ICommand

这个错误是误导性的,实际上它应该引发一个异常,告诉您它不知道如何解决这个问题(看起来像个bug-我将对此进行研究)

这是因为您只能请求明确注册的服务。它不查找继承链

如果您希望能够将类解析为
ICommand
,则需要向注册中添加另一个
。实现
。由于名称必须是唯一的,并且您可能希望按名称解析,因此必须为其指定一个不同于
IVecadCommand
的名称。如果您永远不想将其解析为
IVecadCommand
(解析为
ICommand
)则只需将现有注册从
IVecadCommand
更改为
ICommand

编辑: 实际上我并不是完全正确的-当您通过名称解析时,容器不会检查传递的类型。本例中的问题是将
IVecadCommand
转换为
ICommand
,这是由
TValue.AsType
完成的。但它并没有正确地处理这个问题。我将在即将发布的版本中解决这个问题。我只是不知道怎么回事。为了保持一致性,这里的类型也应该严格。无论如何,如果你按照我上面所说的去解决问题,现在你是安全的

2014年4月10日更新:
我已对此问题进行了修复,因此现在应该可以进行命名解析,以返回已解析的父接口。

是的,我找到了相同的解决方案。谢谢。
Invalid class typecast
var
  i: Integer;
  com: IVecadCommand;
begin
  Result := nil;
  com := ServiceLocator.GetService<IVecadCommand>(actionName);
  com.setSession(designSession);
  Result := com;
end;