0

現在、DWScript + SQLite の ORM マッピングを作成しています。通常のプロパティ (文字列や整数など) のマッピングを正常に実装しましたが、外部キー多対多の関係を追加したいと考えています。このために、クラス A で外部キープロパティを宣言し、実行時にクラス B に関係マネージャーを追加して、関係をモデル化することを計画しました。ソースコードのクラス B に関係マネージャーを配置できることはわかっていますが、フレームワークで宣言されたユーザー モデルへの外部キーを持つモデルがアプリケーションにあると想像してください。新しいアプリケーションごとにフレームワークを変更するのは現実的ではありません。

私の質問: スクリプトの実行時に新しいプロパティ、フィールド、または関数をオブジェクト/クラスに追加するにはどうすればよいですか?

説明するためのコードを次に示します。

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

1 に答える 1

1

DWS の寄稿者はこちら。DWS は「モンキー パッチ」をサポートしていません。スクリプト ソースは、Delphi ソース ファイルと同じくらい静的です。スクリプトの外側 (ネイティブ コード ランド) では状況が異なり、クラスを表すオブジェクトを変更することは可能ですが、コンパイル時にすべてのオフセットが既に計算されているため、これはお勧めできません。深刻なバグを引き起こします。

ただし、AOP を探している場合は、コンパイル時のプロセスにフックして、コンパイルが完了する前にその時点で何かを挿入する必要があります。しかし、その場合でも、挿入するフィールドを参照するコードが既に存在しない限り、この新しいフィールドを作成してもあまり効果がありません。DWSのRTTIを使用してフィールドマネージャーに接続する予定がない限り、何を達成しようとしているのか正確にはわかりません...

于 2014-07-26T18:45:34.363 に答える