gpt4 book ai didi

delphi - 类型化接口(interface)和 Spring4D

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

我正在尝试使用类型化接口(interface)和 Spring4D,但在解析时遇到一些问题。请查看下面的详细信息。

数据库对象:

unit u_DB;

type
TDBObject = class
public
property ID: TGUID;
end;

TDBCRM = class(TDBObject)
public
property SOME_FIELD: TSomeType;
end;
<小时/>

声明:

unit i_BaseDAL;

type
{$M+}
IBaseDAL<T: TDBObject, constructor> = interface
['{56D48844-BD7F-4FF8-A4AE-30DA1A82AD67}']
procedure RefreshData();
....
end;
<小时/>
unit u_BaseDAL;

type
TBaseDAL<T: TDBObject, constructor> = class(TInterfacedObject, IBaseDAL<TDBObject>)
public
procedure RefreshData();
....
end;
<小时/>

之后我就能够注册基础 IBaseDAL 和 IBaseDAL

GlobalContainer.RegisterType<IBaseDAL<TDBObject>>;
GlobalContainer.RegisterType<IBaseDAL<TDBCRM>>;

在项目中使用:

我现在需要解析 IBaseDAL,但找不到如何做。仅在丑陋的方法下有效

DM := GlobalContainer.Resolve('i_BaseDAL.IBaseDAL<u_DB.TDBObject>@TBaseDAL<u_DBCRM.TDBCRM>').AsInterface as IBaseDAL<TDBObject>;

但我希望下面的内容能起作用:) -

DM := GlobalContainer.Resolve(IBaseDAL<TDBCRM>);

请告知如何正确解决?

最佳答案

编辑:我刚刚注意到接口(interface)表不包含通用接口(interface),因此您必须按照下面的说明显式注册它们。

首先您需要注册一个实现而不仅仅是一个接口(interface)。

GlobalContainer.RegisterType<TBaseDAL<TDBObject>>;
GlobalContainer.RegisterType<TBaseDAL<TDBCRM>>;
GlobalContainer.Build;

容器将检查您注册的类并注册所有已实现的接口(interface)(IInterface 除外),以便它了解 IBaseDAL<TDBObject>IBaseDAL<TDBCRM> .

如果您的类可能实现某些接口(interface),您不希望容器知道您必须显式注册:

GlobalContainer.RegisterType<IBaseDAL<TDBObject>, TBaseDAL<TDBObject>>;
GlobalContainer.RegisterType<IBaseDAL<TDBCRM>, TBaseDAL<TDBCRM>>;
GlobalContainer.Build;

然后你可以解决:

GlobalContainer.Resolve<IBaseDAL<TDBCRM>>;

顺便问一下,您确定您的类定义不应该如下所示吗?

type
TBaseDAL<T: TDBObject, constructor> = class(TInterfacedObject, IBaseDAL<T>)

关于delphi - 类型化接口(interface)和 Spring4D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867114/

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