delphi – 如何从Spring4d中的ServiceLocator获取子接口实例?
我是
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'); 然后我尝试在ServiceLocator的帮助下创建一个对象: var i: Integer; com: ICommand; begin Result := nil; com := ServiceLocator.GetService<ICommand>(actionName); com.setSession(designSession); Result := com; end; 作为执行的结果,我有一个例外: Invalid class typecast 为了避免异常,我这样做: var i: Integer; com: IVecadCommand; begin Result := nil; com := ServiceLocator.GetService<IVecadCommand>(actionName); com.setSession(designSession); Result := com; end; 一切都好. 要点是我必须在这种情况下使用TContainer作为TCommand的Repository和继承的类.所以我必须先使用ServiceLocator. 我该怎么做才能避免异常并在TContainer中使用ICommand而不是IVecadCommand? 谢谢.将愉快地提供额外的细节. 解决方法
您注册了IVecadCommand,但要求ICommand.
该错误具有误导性,实际上它应该引发一个异常,告诉你它不知道如何解决(似乎是一个错误 – 我会调查). 那是因为您只能要求明确注册的服务.它不会查找继承链. 如果您希望能够以ICommand的身份解决您的课程,则需要添加另一个.Implements< ICommand>注册.由于名称必须是唯一的,并且您可能希望按名称解析,因此必须为其指定与IVecadCommand不同的名称.如果您永远不想将其解析为IVecadCommand(您可以在解析为ICommand后使用支持),那么只需将现有注册从IVecadCommand更改为ICommand即可. 编辑: 更新10.04.2014:我已经解决了这个问题所以现在应该可以做一个命名解决方案来获取已解析的父接口. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |