加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读