【问题标题】:Typed interfaces and Spring4D类型化接口和 Spring4D
【发布时间】:2015-01-09 18:41:07
【问题描述】:

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

请告知如何正确解决?

【问题讨论】:

    标签: delphi delphi-xe7 spring4d


    【解决方案1】:

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

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

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

    容器将检查您注册的类并注册所有实现的接口(IInterface 除外),因此它会知道IBaseDAL&lt;TDBObject&gt;IBaseDAL&lt;TDBCRM&gt;

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

    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 There is no overloaded version of 'Resolve' that can be called with these arguments
    • 正如你在另一个问题中提到的那样,你称之为解决错误。您输入的不是尖括号而是圆括号。泛型需要尖括号(&lt; &gt; 而不是 ( )
    • 谢谢,但是&lt; &gt; 我得到了[dcc32 Error] frm_CRM.pas(32): E2010 Incompatible types: "i_BaseDAL.IBaseDAL&lt;u_DB.TDBObject&gt;" and "i_BaseDAL.IBaseDAL&lt;u_DB.TDBCRM&gt;"
    • 不确定,我重新检查了 Stefan 的建议,看起来一切正常。我正在准备测试项目并推送到谷歌群
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多