Delphi,如何避免application.CreateForm?
发布时间:2020-12-15 09:39:07 所属栏目:大数据 来源:网络整理
导读:我使用 Spring4d framework进行依赖注入和其他事情. 在应用程序入口点,我必须创建应用程序“Main”表单.虽然,我不知道其他任何方式 Application.CreateForm(TMainForm,MainForm) 创造这个. 是否可以使用Spring4d依赖注入创建Main表单?像这样: MainForm :=
我使用
Spring4d framework进行依赖注入和其他事情.
在应用程序入口点,我必须创建应用程序“Main”表单.虽然,我不知道其他任何方式 Application.CreateForm(TMainForm,MainForm) 创造这个. 是否可以使用Spring4d依赖注入创建Main表单?像这样: MainForm := GlobalContainer.Resolve<IMainForm>; 然后将其设置为打开应用程序时显示的表单? 解决方法
使用DI容器注册主窗体时,可以通过将实例传递给DelegateTo方法来指定工厂函数来创建实例.
在我看来,没有必要将主窗体解析为接口,因为它是组合根,它不会被传递到其他任何地方,所以我会像下面那样注册它. container.RegisterType<TMainForm,TMainForm>.DelegateTo( function: TMainForm begin Application.CreateForm(TMainForm,Result); end); 然后你可以解决它的问题 container.Resolve<TMainForm>; 然而,让容器解析表单的好处是它可能会将依赖关系注入其中,这在此不会发生,因为CreateForm内部的代码创建了实例.这就是在施工后通过容器调用其他方法的可能性.因此,不是像往常一样将依赖项传递给构造函数,而是可以向表单类添加一个let say Init方法,该表单类获取所需的依赖项并向其添加[Inject]属性.这将告诉容器在创建实例之后调用此方法(在我们的例子中通过传递给DelegateTo方法的工厂函数)并将所有必需的依赖项传递给它. 可以通过容器获取依赖关系的最小空主表单如下所示: TMainForm = class(TForm) public [Inject] procedure Init(...); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |