0

たとえば、次のコードがあるとします。

interface
        type 
          IMyInterface1 = interface // GUID
            procedure ButtonEvent(Sender: TObject);
          end;

          IMyInterface2 = interface // GUID
            procedure DoSomething;
          end;

          TMyClass1 = class(TInterfacedObject, IMyInterface1)
          public
            procedure ButtonEvent(Sender: TObject);
          end;

          TMyClass2 = class(TInterfacedObject, IMyInterface2)
          public 
            procedure DoSomething;
          end;

// ...
implementation        
        procedure TMyClass1.ButtonEvent(Sender: TObject);
        var
          aIntf2: TMyInterface2;
        begin
          // Pseudo code:
          // aIntf2 := ServiceLocator.GetService<IMyInterface2>;
          try
            aIntf2.DoSomething;
          finally
            aIntf2 := nil; // will free the instance...
          end;
        end;

    initialization
      // Pseudo code:
      // GlobalContainer register IMyInterface1 / TMyClass1
      // GlobalContainer register IMyInterface2 / TMyClass2
      // GlobalContainer.Build
    end.

メソッド ButtonEvent は、Delphi フォームのボタン クリック イベントによって呼び出されます。

今私の質問: クラス TMyClass2 をインスタンス化するより良い方法はありますか? 私の場合、クラス TMyClass1 への挿入は不可能です。TMyClass2 インスタンスの有効期間は ButtonEvent 内のみです。ButtonEvent への次の呼び出しでは、別のインスタンスを使用する必要があります...

私の知る限り、メソッドパラメーターの注入またはローカル変数の注入はSpring4Dでは不可能ですよね?

4

1 に答える 1

2

DIが解決する問題を解決せず、単にシフトするだけの恐ろしいサービスロケーターパターンを回避したい場合(または、多くの場合、問題をさらに悪化させることさえあります。コードを調べて、サービスロケーターが正しいものを返すようにするには、何らかのタイプを登録する必要があることを理解してください)。

メソッドパラメータの注入またはローカル変数の注入? 一体どのようにそれが可能でしょうか。コンテナーがレジスター/スタックに何かを注入するには、呼び出しをある程度インターセプトする必要があります。

特定のメソッド (仮想メソッド) では傍受が可能ですが、呼び出されたインスタンスをそのために設定する必要があります。そして、それを行うと、最初に依存関係を注入できた可能性があります。

コンポジション ルートに DI を配置しない場合は、依存性注入のプロセスを開始するコード内で、何らかのサービス ロケーターを常に使用する必要があります。

DI、特に何か特定のことを達成するためのツールとしてのコンテナーの使用について考えてみてください。ほとんどの場合、さまざまな利点のためにコードを分離します。前述したように、このような場合にサービス ロケーターを使用すると、解決するよりも多くの問題が発生する可能性があります。

ただし、例に戻ります。これは、ファクトリを使用する典型的なケースです。それを TMyClass1 に注入する必要があります。次に、メソッドでファクトリを呼び出して、IMyInterface2 を取得できます。使用している Spring4D のバージョンに応じて、コンテナーがファクトリを構築できるため、いくつかの作業を節約できるさまざまな方法があります。しかし、古典的なパターンを使用してファクトリを自分で作成することをお勧めします。そうすることで感覚が掴めます。後で、より経験を積んでその使用に自信が持てるようになったら、コンテナーを使用する場所は簡単にその部分を引き継ぐことができます。

于 2015-05-01T16:13:22.433 に答える