验证依赖注入容器构建

时间:2017-09-18 17:09:10

标签: delphi dependency-injection service-locator spring4d

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

但这远非理想。

1 个答案:

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