簡體   English   中英

鍵入的接口和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>);

請告知如何正確解決?

編輯 :我只是注意到,接口表不知道接口表不包含通用接口,所以你必須明確注冊它們,如下所述。

首先,您需要注冊一個實現,而不僅僅是一個接口。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM