2015-12-09 76 views
4

我正在使用RemObjects DataAbstract和Spring4d。 RemObjects生成一個SchemaServer_Intf.pas文件,其中包含存在於其模式中的每種表的接口。它允許「強類型」數據集,允許一個訪問使用Spring4d:如何「強制」容器相信一個類實現了一個接口

(aDataSet as IMyDataSet).MyField := aValue 

這裏的一場是由DataAbstract

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,像這樣:

aDataTable := IEntiteType(TDAMemDataTable.Create(nil)); 

您將有一個 「接口不支持錯誤

但是,只要你做的:

aDataTable.LogicalName := 'EntiteType'; 
aDataTable.BusinessRulesId := MyBusinessRuleID; 

你可以放心地寫

aDataTable := IEntiteType(TDAMemDataTable.Create(nil)); 

而且你沒有得到任何錯誤。

所以,用Spring4d,我想在我的註冊單位寫這個的:

aContainer.RegisterType<TDAMemDataTable>.Implements<IEntiteType>.DelegateTo(
    function : TDAMemDataTable 
    var aDataTable : TDAMemDataTable; 
    begin 
     Result:= TDAMemDataTable.Create(nil); 
     Result.LogicalName := 'EntiteType'; 
     Result.BusinessRulesId := MyBusinessRuleId;   
    end 
) 

但隨後,Spring4d投(有原因)錯誤:

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) 

有沒有辦法覆蓋這個檢查?

回答

4

好的我找到了一種方法來做到這一點。超級其實很簡單:

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

此外,對於有意在一個優雅時尚註冊多個表的人:

aContainer.RegisterType<IAddress>.DelegateTo(TableConfigurator.GetTableDelegate<IAddress>(nme_Address, RID_Address)); 
// Registering other tables here... 

只是創造一些「助手」類用這種方法:

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; 
相關問題