类型化接口和 Spring4D

Typed interfaces and Spring4D

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

请指教如何正确解决?

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

首先你需要注册一个实现而不仅仅是一个接口。

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

容器将检查您注册的 class 并注册所有已实现的接口(IInterface 除外),因此它会知道 IBaseDAL<TDBObject>IBaseDAL<TDBCRM>

如果您的 class 可能实现了一些您不希望容器知道您必须显式注册的接口:

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

那你可以解析:

GlobalContainer.Resolve<IBaseDAL<TDBCRM>>;

顺便问一下,你确定你的class定义不应该是这样的吗?

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