メイン フォームを 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;