我正在尝试使用类型化接口和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>);
请告知如何正确解决?
答案 0 :(得分:2)
编辑:我刚注意到,接口表不知道接口表不包含通用接口,所以你必须按照下面的说明显式注册它们。
首先,您需要注册一个实现,而不仅仅是一个接口。
GlobalContainer.RegisterType<TBaseDAL<TDBObject>>;
GlobalContainer.RegisterType<TBaseDAL<TDBCRM>>;
GlobalContainer.Build;
容器将检查您注册的类并注册所有已实现的接口(IInterface除外),以便它知道 IBaseDAL<TDBObject>
和IBaseDAL<TDBCRM>
。
如果您的类可能实现某些接口,则不希望容器知道您必须显式注册:
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>)