4

依存性注入などにSpring4dフレームワークを使用しています。

アプリケーション エントリ ポイントでは、アプリケーションの「メイン」フォームを作成する必要があります。とはいえ、それ以外の方法を私は知りません

Application.CreateForm(TMainForm, MainForm) 

これを作成します。

Spring4d依存性注入を使用してメインフォームを作成することは可能ですか? そのようです :

MainForm := GlobalContainer.Resolve<IMainForm>;

アプリケーションを開いたときに表示されるフォームに設定しますか?

4

1 に答える 1

10

メイン フォームを DI コンテナーに登録すると、ファクトリ関数を指定してDelegateToメソッドに渡すことでインスタンスを作成できます。

私の意見では、メインフォームはコンポジションルートであり、他の場所には渡されないため、インターフェイスとして解決する必要はありません。次のように登録します。

container.RegisterType<TMainForm,TMainForm>.DelegateTo(
  function: TMainForm
  begin
    Application.CreateForm(TMainForm, Result);
  end);

そして、あなたはそれを呼び出すだけで解決できます

container.Resolve<TMainForm>;

CreateFormただし、コンテナーにフォームを解決させる利点は、コンテナー内のコードがインスタンスを作成するため、ここでは発生しない依存関係をコンテナーに注入できることです。ここで、構築後にコンテナーを介して追加のメソッドを呼び出す可能性が発揮されます。したがって、通常のように依存関係をコンストラクターに渡す代わりにInit、フォーム クラスに let say メソッドを追加して、必要な依存関係を受け取り、それに[Inject]属性を追加することができます。これにより、インスタンスが作成された後に (この場合は DelegateTo メソッドに渡されたファクトリ関数を介して) このメソッドを呼び出し、必要なすべての依存関係を渡すようにコンテナーに指示されます。

コンテナーを介して依存関係を取得できる最小限の空のメイン フォームは、次のようになります。

TMainForm = class(TForm)
public
  [Inject]
  procedure Init(...);
end;
于 2015-12-08T23:22:10.817 に答える