首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring4d:如何“强制”容器相信类实现了接口

Spring4d:如何“强制”容器相信类实现了接口
EN

Stack Overflow用户
提问于 2015-12-09 23:05:25
回答 1查看 478关注 0票数 4

我使用的是RemObjects DataAbstract和Spring4d。RemObjects生成一个SchemaServer_Intf.pas文件,该文件包含存在于其模式中的各种表的接口。它允许“强类型”数据集,允许使用

代码语言:javascript
复制
(aDataSet as IMyDataSet).MyField := aValue

下面是DataAbstract生成的一个接口的快照

代码语言:javascript
复制
IEntiteType = interface(IDAStronglyTypedDataTable)
  ['{96B82FF7-D087-403C-821A-0323034B4B99}']
    { Property getters and setters }
    function GetEntiteIdValue: String;
    procedure SetEntiteIdValue(const aValue: String);
    function GetEntiteIdIsNull: Boolean;
    procedure SetEntiteIdIsNull(const aValue: Boolean);
    function GetNameValue: WideString;
    procedure SetNameValue(const aValue: WideString);
    function GetNameIsNull: Boolean;
    procedure SetNameIsNull(const aValue: Boolean);
    function GetIsSystemValue: SmallInt;
    procedure SetIsSystemValue(const aValue: SmallInt);
    function GetIsSystemIsNull: Boolean;
    procedure SetIsSystemIsNull(const aValue: Boolean);


    { Properties }
    property EntiteId: String read GetEntiteIdValue write SetEntiteIdValue;
    property EntiteIdIsNull: Boolean read GetEntiteIdIsNull write SetEntiteIdIsNull;
    property Name: WideString read GetNameValue write SetNameValue;
    property NameIsNull: Boolean read GetNameIsNull write SetNameIsNull;
    property IsSystem: SmallInt read GetIsSystemValue write SetIsSystemValue;
    property IsSystemIsNull: Boolean read GetIsSystemIsNull write SetIsSystemIsNull;
  end;

不过,有一个问题。如果您像这样抛出一个dataTable:

代码语言:javascript
复制
aDataTable := IEntiteType(TDAMemDataTable.Create(nil));

您将有一个“接口不支持错误

但是,一旦你做到了:

代码语言:javascript
复制
aDataTable.LogicalName := 'EntiteType';
aDataTable.BusinessRulesId := MyBusinessRuleID;

你可以安全地写

代码语言:javascript
复制
aDataTable := IEntiteType(TDAMemDataTable.Create(nil));

你也不会犯任何错误。

因此,在使用Spring4d时,我想在我的注册单元中写这个:

代码语言:javascript
复制
aContainer.RegisterType<TDAMemDataTable>.Implements<IEntiteType>.DelegateTo(
   function : TDAMemDataTable
   var aDataTable : TDAMemDataTable; 
   begin
      Result:= TDAMemDataTable.Create(nil);
      Result.LogicalName := 'EntiteType';
      Result.BusinessRulesId := MyBusinessRuleId;         
   end
) 

但是,Spring4d抛出(有原因的)错误:

代码语言:javascript
复制
Exception 'first chance' à $762D5B68. Classe d'exception ERegistrationException avec un message 'Component type "uDAMemDataTable.TDAMemDataTable" incompatible with service type "SchemaClient_Intf.IEntiteType".'. Processus EntiteREM2.exe (3088) 

有办法覆盖这张支票吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-09 23:22:14

好的,我找到了一种方法。其实超级简单:

代码语言:javascript
复制
  aContainer.RegisterType<IAddress>.DelegateTo(
    function : IAddress
    var aTable : TDAMemDataTable;
    begin
      aTable := TDAMemDataTable.Create(nil);
      aTable.LogicalName := nme_Address;
      aTable.BusinessRulesID := RID_Address;
      Result := aTable as IAddress;
    end
  );

此外,对于有意以优雅的方式注册许多表的人来说:

代码语言:javascript
复制
aContainer.RegisterType<IAddress>.DelegateTo(TableConfigurator.GetTableDelegate<IAddress>(nme_Address, RID_Address));
// Registering other tables here...

只需使用此方法创建一些"Helper“类:

代码语言:javascript
复制
class function TableConfigurator.GetTableDelegate<T>(aLogicalName, aBusinessRulesId: string): TActivatorDelegate<T>;
begin
  Result := (function: T
    var
      aTable: TDAMemDataTable;
    begin
      aTable := TDAMemDataTable.Create(nil);
      aTable.LogicalName := aLogicalName;
      aTable.BusinessRulesID := aBusinessRulesId;
      Result := T(TValue.From(aTable).AsInterface);
    end);
end;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34190717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档