gpt4 book ai didi

delphi - Spring4d中如何从ServiceLocator获取子接口(interface)实例?

转载 作者:行者123 更新时间:2023-12-03 15:25:16 25 4
gpt4 key购买 nike

我对 Spring4D 框架非常陌生,请寻求帮助。

我有下一个类和接口(interface):

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

为了避免异常(exception),我这样做:

var
i: Integer;
com: IVecadCommand;
begin
Result := nil;
com := ServiceLocator.GetService<IVecadCommand>(actionName);
com.setSession(designSession);
Result := com;
end;

那么一切就OK了。

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

我应该怎样做才能避免异常并在 TContainer 中使用 ICommand 而不是 IVecadCommand?

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

最佳答案

您注册了IVecadCommand但要求 ICommand .

该错误具有误导性,实际上它应该引发一个异常,告诉您它不知道如何解决该问题(似乎是一个错误 - 我会对此进行调查)。

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

如果您希望能够将您的类(class)解析为 ICommand您需要添加另一个 .Implements<ICommand>到注册。由于名称必须是唯一的,并且您可能想按名称解析,因此必须为其指定一个与 IVecadCommand 不同的名称。 。如果您不想将其解析为 IVecadCommand (一旦解析为 ICommand ,您就可以使用支持)然后只需将现有注册从 IVecadCommand 更改即可。至ICommand .

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

2014 年 4 月 10 日更新:我已经修复了这个问题,所以现在应该可以执行命名解析来获取已解析接口(interface)的父接口(interface)。

关于delphi - Spring4d中如何从ServiceLocator获取子接口(interface)实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22762478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com