gpt4 book ai didi

Delphi,如何避免application.CreateForm?

转载 作者:行者123 更新时间:2023-12-03 15:19:56 27 4
gpt4 key购买 nike

我正在使用Spring4d framework用于依赖注入(inject)和其他事情。

在应用程序入口点中,我必须创建应用程序“主”表单。不过,我不知道除了

Application.CreateForm(TMainForm, MainForm) 

创建这个。

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

MainForm := GlobalContainer.Resolve<IMainForm>;

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

最佳答案

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

在我看来,不需要将主表单解析为接口(interface),因为它是组合根,并且不会传递到其他任何地方,因此我将像下面一样注册它。

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

然后你可以调用来解决它

container.Resolve<TMainForm>;

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

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

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

关于Delphi,如何避免application.CreateForm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com