gpt4 book ai didi

delphi - 如何在Spring4D GlobalContainer中初始化主应用程序表单?

转载 作者:行者123 更新时间:2023-12-03 15:08:26 27 4
gpt4 key购买 nike

例如,我有一个主表单,想要注入(inject)一个记录器实例作为私有(private)字段。

我注册记录器

GlobalContainer.RegisterType<TCNHInMemoryLogger>.Implements<ILogger>;

我的主表单中有一个私有(private)字段

private
FLogger: ILogger;

我想要的就是做到这一点:

private
[Inject]
FLogger: ILogger;

在我的 DPR 文件中,我有典型的 delphi 方式来创建主表单:

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(Tfrm_CNH, frm_CNH);
Application.Run;
end.

我应该如何更改表单创建方式才能正确注入(inject)私有(private)字段?

顺便说一下,如果我使用 GlobalContainer.Resolve 解析 Form.OnCreate 中的字段,它就可以正常工作。但我想避免在我的表单中使用 GlobalContainer 变量。

最佳答案

您还必须将表单注册到容器中。这样做是这样的:

procedure BuildContainer(const container: TContainer);
begin
container.RegisterType<ILogger, TCNHInMemoryLogger>;
container.RegisterType<TForm8, TForm8>.DelegateTo(
function: TForm8
begin
Application.CreateForm(TForm8, Result);
end);
container.Build;
end;

在你的 main 中你可以写:

begin
BuildContainer(GlobalContainer);
Application.Initialize;
Application.MainFormOnTaskbar := True;
frm_CNH := GlobalContainer.Resolve<Tfrm_CNH>;
Application.Run;
end.

您甚至可以为 TApplication 编写一个帮助程序,这样您就可以保留 Application.CreateForm 调用,并且不会让 IDE 时不时地弄乱您的主程序。

type
TApplicationHelper = class helper for TApplication
procedure CreateForm(InstanceClass: TComponentClass; var Reference);
end;

procedure TApplicationHelper.CreateForm(InstanceClass: TComponentClass;
var Reference);
begin
if GlobalContainer.HasService(InstanceClass.ClassInfo) then
TObject(Reference) := GlobalContainer.Resolve(InstanceClass.ClassInfo).AsObject
else
inherited CreateForm(InstanceClass, Reference);
end;

然后,您当然需要确保您的 BuildContainer 例程不使用该帮助程序(放入单独的注册单元中),否则您最终会陷入递归。

关于delphi - 如何在Spring4D GlobalContainer中初始化主应用程序表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com