类型化接口和Spring4D

4
我将尝试使用类型化接口和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>);

请建议如何正确解决这个问题?(保留HTML标签)
1个回答

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>)

我尝试了我描述的两种变体的类定义,以及你的变体,但没有任何更改。我还尝试了你的建议,但是得到了相同的错误:[dcc32 Error] fr_CRM.pas(231): E2250 没有重载版本的'Resolve'可以使用这些参数调用 - SpanishBoy
正如您在另一个问题中提到的那样,您错误地调用了Resolve。您没有键入尖括号而是圆括号。泛型要求使用尖括号(< >而不是( ))。 - Stefan Glienke
谢谢,但是使用 < > 我得到了 [dcc32 Error] frm_CRM.pas(32): E2010 Incompatible types: "i_BaseDAL.IBaseDAL<u_DB.TDBObject>" and "i_BaseDAL.IBaseDAL<u_DB.TDBCRM>" 的错误。 - YoungMaster
不确定,我重新检查了Stefan的建议,看起来一切都没问题。我正准备准备测试项目并推送到Google组。 - SpanishBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接