Delphi 如何从Spring4d中的ServiceLocator获取子接口实例?
我是Spring4D框架的新手,请求帮助 我有下一个类和接口: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
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;