我正在使用Spring4d framework进行依赖注入和其他事情。
在应用程序入口点,我必须创建应用程序“Main”表单。虽然,我不知道除了
之外的任何其他方式Application.CreateForm(TMainForm, MainForm)
创建此。
是否可以使用Spring4d依赖注入创建Main表单?像这样:
MainForm := GlobalContainer.Resolve<IMainForm>;
然后将其设置为打开应用程序时显示的表单?
答案 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;