4

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

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

Application.CreateForm(TMainForm, MainForm) 

创建这个。

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

MainForm := GlobalContainer.Resolve<IMainForm>;

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

4

1 回答 1

10

当您向 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;
于 2015-12-08T23:22:10.817 回答