8

私は Delphi Spring Framework を使い始めたばかりで、現在のバージョンの DI コンテナーで、実装型を指定せずにファクトリ メソッドに構築を委譲できるかどうか疑問に思っていました。

たとえば、これに似たもの:

GlobalContainer
  .RegisterFactory<ISomeObject>(
    function: ISomeObject 
    begin 
      Result := CreateComObject(CLASS_SomeObject) as ISomeObject; 
    end)
  .Implements<ISomeObject>  // could probably be implied from the above
  .AsSingletonPerThread;

ご覧のとおり、私の具体的なユース ケースは、COM オブジェクトのインスタンス化です。その場合、関心のあるインターフェイスを実装するクラスはアプリケーションの一部ではありませんが、CreateComObject/を呼び出してインスタンスを作成することはできますCoCreateInstance。ただし、コンテナ内の登録は常に実際の実装クラスにバインドされているように見えるため、運が悪いようです。

現時点でこれが不可能であると仮定すると、専門家はこれにどのように対処しますか? ラッパー クラスまたはダミー クラスを作成しますか、それとも単に COM オブジェクトを DI コンテナーから除外し、単純にインスタンス化しますCreateComObjectか?

4

2 に答える 2

9

残念ながら、Spring DI コンテナーの現在の設計では、それが許可されていません。すべてのサービス タイプ (通常はインターフェイスですが、クラスの場合もあります) がコンポーネント タイプ (クラス) によって実装されていると内部的に想定しています。したがって、この場合TObjectに必要ないくつかの場所があります。IInterfaceDelegateTo メソッドに渡すデリゲートと同様に、サービス タイプではなく、コンポーネント タイプ (非ジェネリックの場合は TObject) を返します。

これは、1 つの流暢なインターフェース呼び出しで、1 つのコンポーネント タイプを複数のインターフェース実装に登録できるためでもあります。お気に入り:

GlobalContainer
  .RegisterType<TMyObject>
  .Implements<IMyInterface>
  .Implements<IMyOtherInterface>;

TMyObjectコンテナーは、と と互換性があるかどうかをチェックするようにIMyInterfaceなりIMyOtherInterfaceました。Resolveサービス リゾルバーを呼び出すときGetInterfaceに、インスタンスで使用して、要求されたインターフェイス参照を取得します。それ以降はすべて、オブジェクト参照で行われます。

インターフェイスを登録するときに実装クラスに依存しないことを要求する DI コンテナーのいくつかの計画があるため、この問題は将来的に対処されますが、すぐには解決されません。

更新 (2012 年 8 月 11 日):

r522 以降、次の方法でインターフェイス タイプを登録できます。

GlobalContainer
  .RegisterType<ISomeObject>
  .DelegateTo(
    function: ISomeObject 
    begin 
      Result := CreateComObject(CLASS_SomeObject) as ISomeObject; 
    end)
  .AsSingletonPerThread;

この例ではISomeObject、継承元の GUID を持つサービスおよびインターフェイスとして登録されます。

さらに、呼び出しによって他のインターフェイスを追加できますがImplements<T>、クラスとは異なり、構築されたインスタンスが実際にそのインターフェイスをサポートしている場合、それは単に不可能であるため、登録時に検証は行われません。現在、サポートされていないサービス タイプでnil呼び出したときに取得されます。Resolve<T>将来、例外が発生する可能性があります。

于 2012-07-03T16:22:12.823 に答える
1

現在、Spring フレームワークのアーキテクチャがサポートしているようには見えませんが、確かに実現可能です。これはspring4d サポート グループで提案されており、そのアイデアに関心があります。

には、ラッピングに使用できるジェネリックTFactoryクラスがあります。Spring.DesignPatternsCreateComObject/COCreateInstance

于 2012-07-03T16:11:27.457 に答える