Delphi,如何避免application.CreateForm?

Delphi, how to avoid application.CreateForm?

我正在使用 Spring4d framework 进行依赖注入和其他操作。

在应用程序入口点,我必须创建应用程序 "Main" 表单。虽然,除了

我不知道还有什么别的办法
Application.CreateForm(TMainForm, MainForm) 

创建这个。

是否可以使用 Spring4d 依赖注入创建主窗体?像这样:

MainForm := GlobalContainer.Resolve<IMainForm>;

然后将其设置为打开应用程序时显示的表单?

当您向 DI 容器注册主窗体时,您可以通过将工厂函数传递给 DelegateTo 方法来指定创建实例的工厂函数。

我认为没有必要将主窗体解析为接口,因为它是组合根,不会被传递到其他任何地方,所以我将像下面这样注册它。

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

然后你可以调用

解决它
container.Resolve<TMainForm>;

然而,让容器解析表单的好处是它可能会向其中注入依赖项,这在此处不会发生,因为 CreateForm 中的代码创建了实例。这就是在构造后通过容器调用其他方法的可能性发挥作用的地方。因此,不是像往常一样将依赖项传递到构造函数中,而是可以将 Init 方法添加到表单 class 中,该方法接受所需的依赖项并向其添加 [Inject] 属性。这将告诉容器在创建实例后调用此方法(在我们的例子中是通过传递给 DelegateTo 方法的工厂函数)并将所有必需的依赖项传递给它。

可以通过容器获取依赖项的最小空主窗体如下所示:

TMainForm = class(TForm)
public
  [Inject]
  procedure Init(...);
end;