2014-07-26 77 views
0

目前我爲DWScript + SQLite編寫了一個ORM映射。我已經成功實現了普通屬性(如字符串或整數)的映射,但現在我想添加外鍵多對多的關係。爲此,我已計劃在類A中聲明外鍵屬性,然後在運行時向類B添加一個關係管理器來建模關係。我知道我可以將B中的關係管理器放在源代碼中,但想象一下,如果我的應用程序中有一些模型對框架中聲明的用戶模型有外鍵。修改每個新應用程序的框架是不現實的。DWScript,Monkey Patching:在運行時添加方法或屬性

我的問題:如何在腳本運行時將新屬性,字段或函數添加到對象/類?

這裏是一些代碼解釋:

type TClassB = class; 

type TRelationManager = class end; // a class which controls the access to the relation, only a stub 

type 
    [XORM_ForeignKey('LinkB')] //attribute to indicate property "LinkB" as Foreign Key 
    TClassA = class(TBaseModel) 
    private 
     FLinkB : TClassB; 
    published 
     property LinkB : TClassB; //Foreign Key to TClassB 
    end; 

    TClassB = class(TBaseModel) 
    private 
    published 
     // This field should be added at runtime and not directly in the source code, as shown here. 
     RelationManager : TRelationManager; 
    end; 
+1

..所以你的問題是什麼? Many2Many基數需要一個數據透視表,所以有些東西比外鍵多。爲什麼把這個屬性放在課堂上而不是財產上?什麼是「TRelationManager」? –

+0

我調整了我的帖子並添加了一個明確的問題。我知道Many2Many的基數與外鍵不同。我的問題只針對方面,如何訪問其他類(在我的例子TClassB)的關係。在後臺發生了什麼,後臺發生了什麼,將被RelationManager隱藏起來。 我無法將屬性放在屬性級別,因爲DWScript只支持類屬性。如果DWScript將實現這個擴展,我也會改變它。 – DragonFlyOfGold

回答

1

DWS貢獻者這裏。 DWS不支持「猴子補丁」腳本源與Delphi源文件一樣是靜態的。從腳本的外部(在本地代碼域中)情況是不同的,可以修改代表類的對象,但不建議這樣做,因爲所有的偏移量都是在編譯時計算出來的,所以你可以最終導致嚴重的錯誤。

但是,如果您正在尋找AOP,那麼在編譯完成之前,您需要的是掛鉤編譯時過程並插入內容。但即使如此,除非已經有代碼指向你插入的字段,否則讓這個新字段不會有太大的好處。我不確定你想要完成什麼,除非你打算使用DWS的RTTI連接到現場經理...

相關問題