Delphi,如何避免application.CreateForm?

时间:2015-12-08 19:43:50

标签: delphi dependency-injection spring4d

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

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

之外的任何其他方式
Application.CreateForm(TMainForm, MainForm) 

创建此。

是否可以使用Spring4d依赖注入创建Main表单?像这样:

MainForm := GlobalContainer.Resolve<IMainForm>;

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

1 个答案:

答案 0 :(得分:10)

使用DI容器注册主表单时,可以通过将实例传递给DelegateTo方法来指定工厂函数来创建实例。

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

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

然后你可以解决它的问题

container.Resolve<TMainForm>;

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

可以通过容器获取依赖关系的最小空主表单如下所示:

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