当我使用依赖注入容器(Spring4D)构建应用程序时,我想知道容器是否正确构建。在这种情况下:
GlobalContainer.RegisterType<TApp>;
GlobalContainer.RegisterType<TMyForm>;
GlobalContainer.Build;
如果TMyForm继承自Vcl.Forms.TForm,那么容器将会建立,但应用程序不会起作用,因为实际上TMyForm根本没有注册。我想知道是否有可能验证构建过程。特别是解析器会解析我认为应该的构造函数,而不是默认构造函数吗?
我尝试过类似的东西:
var
registeredTypes: Spring.Collections.IEnumerable<TComponentModel>;
registeredType: TComponentModel;
begin
GlobalContainer.RegisterType<TApp>;
GlobalContainer.RegisterType<TMyForm>;
GlobalContainer.Build;
registeredTypes := GlobalContainer.Kernel.Registry.FindAll;
for registeredType in registeredTypes do
begin
if not GlobalContainer.Kernel.Registry.HasService(registeredType.ComponentTypeInfo) then
raise Exception.Create('Build Error');
end;
但这远非理想。
答案 0 :(得分:1)
夜间搜索和测试后,我能够实现我的目标。 如果您只是注册类型:
GlobalContainer.RegisterType<TApp>;
容器将使用他能够使用的第一个构造函数来解析此类型。要强制容器使用你想要的这个构造函数,你必须标记这个构造函数[Injected],就像那样:
TApp = class
private
_form: TMyForm;
_a: TAppCos;
public
constructor Create; overload;
constructor Create(form: TMyForm); overload;
[Inject]
constructor Create(a: TAppCos); overload;
end;
...
GlobalContainer.RegisterType<TApp>;
现在容器将尝试解析构造函数Create(a:TAppCos),如果失败,他将显示如下消息:“无法解析:TApp”。(不像以前那样使用另一个)。这就是我想要实现的目标。
编辑: 不要忘记将Spring.Container.Common添加到TApp单元中使用。