我正在使用Spring4d 框架 进行依赖注入和其他事情。
在应用程序入口点,我必须创建应用程序“主”表单。虽然,我不知道除了
Application.CreateForm(TMainForm, MainForm)
创建这个。
是否可以使用 Spring4d 依赖注入创建主窗体?像这样:
MainForm := GlobalContainer.Resolve<IMainForm>;
然后将其设置为打开应用程序时将显示的表单?
我正在使用Spring4d 框架 进行依赖注入和其他事情。
在应用程序入口点,我必须创建应用程序“主”表单。虽然,我不知道除了
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
向表单类添加一个 let say 方法,而不是像往常一样将依赖项传递给构造函数,该方法获取所需的依赖项[Inject]
并向其添加属性。这将告诉容器在创建实例后调用此方法(在我们的例子中,通过传递给 DelegateTo 方法的工厂函数)并将所有必需的依赖项传递给它。
可以通过容器获取依赖项的最小空主表单如下所示:
TMainForm = class(TForm)
public
[Inject]
procedure Init(...);
end;