4

型付きインターフェースと Spring4D を使用しようとしていますが、解決に問題があります。以下の詳細を確認してください。

DB オブジェクト:

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

どうすれば正しく解決できるか教えてください。

4

1 に答える 1

2

編集:インターフェイステーブルにジェネリックインターフェイスが含まれていないことに気付いたので、以下で説明するように明示的に登録する必要があります。

最初に、インターフェースだけでなく、実装を登録する必要があります。

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

IBaseDAL<TDBObject>コンテナーは、登録したクラスを検査し、実装されているすべてのインターフェイス (IInterface を除く) を登録して、およびについて認識しIBaseDAL<TDBCRM>ます。

クラスがいくつかのインターフェースを実装する可能性がある場合、明示的に登録する必要があることをコンテナーに知られたくない場合:

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>)
于 2015-01-10T00:10:48.237 に答える