我使用Spring4d框架 进行依赖注入和其他事情.
在应用程序入口点,我必须创建应用程序"Main"表单.虽然,我不知道其他任何方式
Application.CreateForm(TMainForm, MainForm)
创造这个.
是否可以使用Spring4d依赖注入创建Main表单?像这样:
MainForm := GlobalContainer.Resolve;
然后将其设置为打开应用程序时显示的表单?
使用DI容器注册主窗体时,可以通过将实例传递给DelegateTo
方法来指定工厂函数来创建实例.
在我看来,没有必要将主窗体解析为接口,因为它是组合根,它不会被传递到其他任何地方,所以我会像下面那样注册它.
container.RegisterType.DelegateTo( function: TMainForm begin Application.CreateForm(TMainForm, Result); end);
然后你可以解决它的问题
container.Resolve;
然而,让容器解析表单的好处是它可能会将依赖关系注入其中,这不会发生在这里,因为内部的代码CreateForm
创建了实例.这就是在施工后通过容器调用其他方法的可能性.因此,不是像往常一样将依赖项传递给构造函数,而是可以Init
向表单类添加一个let say 方法,该表单类获取所需的依赖项[Inject]
并向其添加属性.这将告诉容器在创建实例之后调用此方法(在我们的例子中通过传递给DelegateTo方法的工厂函数)并将所有必需的依赖项传递给它.
可以通过容器获取依赖关系的最小空主表单如下所示:
TMainForm = class(TForm) public [Inject] procedure Init(...); end;