Delphi 在Spring4D中,是否可以注册通用接口?

Delphi 在Spring4D中,是否可以注册通用接口?,delphi,dependency-injection,spring4d,Delphi,Dependency Injection,Spring4d,我有一些类有一个构造函数,比如 constructor Create(Factory: IFactory<IConnection>) 构造函数创建(工厂:IFactory) 当我尝试在容器中注册IFactory时 Container.RegisterType<IFactory<IConnection>,TConnectionFactory> Container.RegisterType 或 Container.RegisterType.Impleme

我有一些类有一个构造函数,比如

constructor Create(Factory: IFactory<IConnection>)
构造函数创建(工厂:IFactory)
当我尝试在容器中注册IFactory时

Container.RegisterType<IFactory<IConnection>,TConnectionFactory> 
Container.RegisterType

Container.RegisterType.Implements
我收到一个错误,说明接口没有guid

我真的不想添加很多毫无意义的接口,比如

IConnectionFactory = interface(IFactory<IConnection>)
  ['{45106BA8-43E7-4D26-B0EF-1639871B93E4}']
end;
IConnectionFactory=接口(IFactory)
[{45106BA8-43E7-4D26-B0EF-1639871B93E4}]
结束;
但这是唯一的办法吗


非常感谢您发现通用接口可以有GUID

这本身不会造成伤害,除非你
查询接口/支持
IList
,因为它是
IList
的一个东西,一旦你开始使用它,它会错误地成功,然后失败。FWIW由于您提到了这些类型,而集合接口都有GUID,因此在使用它们时不需要进行此类查询,但它们是内部必需的,然后保留在相同的泛型类型参数中

当前,GUID用于检查并从实现对象获取接口,因为RTL仅支持使用GUID而不支持使用typeinfo

事实上,以下代码在注册期间不会引发异常,但在解决时最终会导致缺陷:

RegisterType
其中
TSomeFactory
实现
IFactory

但是,有一些相当隐藏的typeinfo可用(参见
System.TInterfaceTable
中的注释行),其中包含所实现接口的确切typeinfo。Spring4D在某些地方内部使用它,例如
Spring.Reflection.trttityhelper.GetInterfaces
。 这可以使用,但还有另一个问题:跨多个模块的泛型类型具有不同的typeinfo。因此,在注册期间简单地使用这些信息进行验证并从实现类查询接口并不容易,因为现在容器(通过一些扩展)支持跨多个模块的注册和依赖关系


使注册更加健壮,如果可能的话,取消在接口上使用GUID的要求,这是我计划在今年晚些时候进行的容器重构列表中的一项内容。

在游戏中,我发现我可以将GUID添加到通用接口IFactory,然后将其解析。我使用IList和IList对其进行了测试,这两种方法都有效,但始终避免向通用接口添加guid,因为在解析时,它如何知道我是想要IList还是IList,因为两者的guid都相同?
IConnectionFactory = interface(IFactory<IConnection>)
  ['{45106BA8-43E7-4D26-B0EF-1639871B93E4}']
end;