在 Spring4D 中是否可以注册泛型接口?
In Spring4D is it possible to register generic interfaces?
我 类 有一个构造函数,例如
constructor Create(Factory: IFactory<IConnection>)
当我尝试在容器中注册 IFactory 时
Container.RegisterType<IFactory<IConnection>,TConnectionFactory>
或
Container.RegisterType<TConnectionFactory>.Implements<IFactory<IConnection>>
我收到一条错误消息,指出该界面没有 GUID。
我真的不想添加很多无意义的界面,例如
IConnectionFactory = interface(IFactory<IConnection>)
['{45106BA8-43E7-4D26-B0EF-1639871B93E4}']
end;
解决这个问题,但这是唯一的方法吗?
非常感谢
如您所见,通用界面可以有一个 GUID。
它本身不会造成任何伤害,直到你从一个 QueryInterface/Supports
IList<string>
的东西开始,它会错误地成功并随后在你开始使用它时失败。 FWIW,因为你提到了这些类型,而集合接口都有 guid,所以在使用它们时不需要做这样的查询,但它们在内部是必需的,然后保持在相同的通用类型参数中。
目前,GUID 正用于检查和获取实现对象的接口,因为 RTL 仅支持使用 GUID 而不是类型信息。
事实上,以下代码在注册期间不会引发异常,但在解决时最终会导致缺陷:
RegisterType<IFactory<IConnection>, TSomeFactory>
其中 TSomeFactory
实现 IFactory<ISomethingElse>
然而,有一些相当隐藏的可用类型信息(请参阅 System.TInterfaceTable
中的注释行),它们具有已实现接口的确切类型信息。 Spring4D 在某些地方内部使用它,例如 Spring.Reflection.TRttiTypeHelper.GetInterfaces
。
这可以使用,但还有另一个问题:跨多个模块的泛型类型具有不同的类型信息。因此,在注册期间简单地使用该信息进行验证并从实现中查询接口并不是那么容易 class 因为现在容器(通过一些扩展)支持跨多个模块的注册和依赖关系。
使注册更加稳健,如果可能的话,取消在界面上使用 GUID 的要求是我计划在今年晚些时候进行的容器重构的清单上的内容。
我 类 有一个构造函数,例如
constructor Create(Factory: IFactory<IConnection>)
当我尝试在容器中注册 IFactory 时
Container.RegisterType<IFactory<IConnection>,TConnectionFactory>
或
Container.RegisterType<TConnectionFactory>.Implements<IFactory<IConnection>>
我收到一条错误消息,指出该界面没有 GUID。
我真的不想添加很多无意义的界面,例如
IConnectionFactory = interface(IFactory<IConnection>)
['{45106BA8-43E7-4D26-B0EF-1639871B93E4}']
end;
解决这个问题,但这是唯一的方法吗?
非常感谢
如您所见,通用界面可以有一个 GUID。
它本身不会造成任何伤害,直到你从一个 QueryInterface/Supports
IList<string>
的东西开始,它会错误地成功并随后在你开始使用它时失败。 FWIW,因为你提到了这些类型,而集合接口都有 guid,所以在使用它们时不需要做这样的查询,但它们在内部是必需的,然后保持在相同的通用类型参数中。
目前,GUID 正用于检查和获取实现对象的接口,因为 RTL 仅支持使用 GUID 而不是类型信息。
事实上,以下代码在注册期间不会引发异常,但在解决时最终会导致缺陷:
RegisterType<IFactory<IConnection>, TSomeFactory>
其中 TSomeFactory
实现 IFactory<ISomethingElse>
然而,有一些相当隐藏的可用类型信息(请参阅 System.TInterfaceTable
中的注释行),它们具有已实现接口的确切类型信息。 Spring4D 在某些地方内部使用它,例如 Spring.Reflection.TRttiTypeHelper.GetInterfaces
。
这可以使用,但还有另一个问题:跨多个模块的泛型类型具有不同的类型信息。因此,在注册期间简单地使用该信息进行验证并从实现中查询接口并不是那么容易 class 因为现在容器(通过一些扩展)支持跨多个模块的注册和依赖关系。
使注册更加稳健,如果可能的话,取消在界面上使用 GUID 的要求是我计划在今年晚些时候进行的容器重构的清单上的内容。