1

我有具有构造函数的类,例如

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;

解决这个问题,但这是唯一的方法吗?

非常感谢

4

1 回答 1

1

正如您发现的那样,通用接口可以有一个 GUID。

这本身不会造成任何伤害,除非你QueryInterface/Supports IList<string>从一个IList<Integer>会错误地成功并且一旦你开始使用它就会失败的东西。FWIW,因为您提到了这些类型,而集合接口都有 guid,所以在使用它们时不需要进行此类查询,但它们在内部是必需的,然后保留在相同的泛型类型参数中。

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

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

RegisterType<IFactory<IConnection>, TSomeFactory>在哪里TSomeFactory实现IFactory<ISomethingElse>

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

使注册更加健壮,如果可能的话,删除在界面上具有 GUID 的要求是我计划在今年晚些时候进行的容器重构列表中的内容。

于 2021-01-14T18:16:37.030 回答