1

当我使用依赖注入容器(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;

但这远非理想。

4

1 回答 1

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 单元中的使用。

于 2017-09-19T10:09:33.800 回答