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;
我正在使用 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;