gpt4 book ai didi

德尔福 Spring DI : Is it possible to delegate interface instantiation without an implementing type?

转载 作者:行者123 更新时间:2023-12-03 14:52:28 24 4
gpt4 key购买 nike

我刚刚开始使用 Delphi Spring 框架,想知道当前版本的 DI 容器是否以某种方式允许将构造委托(delegate)给工厂方法而不指定实现类型?

例如与此类似的东西:

GlobalContainer
.RegisterFactory<ISomeObject>(
function: ISomeObject
begin
Result := CreateComObject(CLASS_SomeObject) as ISomeObject;
end)
.Implements<ISomeObject> // could probably be implied from the above
.AsSingletonPerThread;

如您所见,我的具体用例是 COM 对象的实例化。在这种情况下,实现我感兴趣的接口(interface)的类不是我的应用程序的一部分,但我仍然可以通过调用 CreateComObject/CoCreateInstance 创建实例。然而,我似乎运气不好,因为容器中的注册似乎总是绑定(bind)到实际的实现类。

假设目前这是不可能的,你们的专家将如何解决这个问题?您会创建一个包装类或虚拟类,还是只是将 COM 对象保留在 DI 容器之外并通过 CreateComObject 实例化它们?

最佳答案

不幸的是,Spring DI 容器的当前设计不允许这样做。它内部假设每个服务类型(通常是接口(interface),但也可以是类)都是由组件类型(类)实现的。因此有TObject在我们需要的几个地方 IInterface在这种情况下。就像您传递给 DelegateTo 方法的委托(delegate)一样,返回组件类型(或非通用情况下的 TObject)而不是服务类型。

这也是因为您可以在一次流畅的接口(interface)调用中注册一种具有多个接口(interface)实现的组件类型。喜欢:

GlobalContainer
.RegisterType<TMyObject>
.Implements<IMyInterface>
.Implements<IMyOtherInterface>;

容器现在检查是否 TMyObjectIMyInterface 兼容和IMyOtherInterface 。调用Resolve时服务解析器使用 GetInterface在实例上获取请求的接口(interface)引用。超出该点的所有操作都是在对象引用上完成的。

由于我对 DI 容器有一些计划,要求在注册接口(interface)时不依赖于实现类,因此这个问题将在将来得到解决,但不会很快得到解决。

更新(2012 年 11 月 8 日):

自 r522 起,可以通过以下方式注册接口(interface)类型:

GlobalContainer
.RegisterType<ISomeObject>
.DelegateTo(
function: ISomeObject
begin
Result := CreateComObject(CLASS_SomeObject) as ISomeObject;
end)
.AsSingletonPerThread;

在此示例中,它将注册 ISomeObject作为服务以及具有其继承的 GUID 的任何接口(interface)。

此外,您还可以通过调用 Implements<T> 添加其他接口(interface)但与类不同的是,如果构造的实例实际上确实支持该接口(interface),则在注册时不会进行验证,因为这是不可能的。目前您将获得nil调用Resolve<T>时具有不受支持的服务类型。将来可能会引发异常。

关于德尔福 Spring DI : Is it possible to delegate interface instantiation without an implementing type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312357/

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