Delphi 依赖项注入容器构建的验证

Delphi 依赖项注入容器构建的验证,delphi,dependency-injection,service-locator,spring4d,Delphi,Dependency Injection,Service Locator,Spring4d,当我使用依赖注入容器(Spring4D)构建应用程序时,我想知道容器是否正确构建。在这种情况下: GlobalContainer.RegisterType<TApp>; GlobalContainer.RegisterType<TMyForm>; GlobalContainer.Build; GlobalContainer.RegisterType; GlobalContainer.RegisterType; 环球集装箱。建造; 若TMyForm从Vcl.Forms.

当我使用依赖注入容器(Spring4D)构建应用程序时,我想知道容器是否正确构建。在这种情况下:

GlobalContainer.RegisterType<TApp>;
GlobalContainer.RegisterType<TMyForm>;
GlobalContainer.Build;
GlobalContainer.RegisterType;
GlobalContainer.RegisterType;
环球集装箱。建造;
若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;
GlobalContainer.RegisterType<TApp>;
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>;
var
注册类型:Spring.Collections.IEnumerable;
registeredType:TComponentModel;
开始
GlobalContainer.RegisterType;
GlobalContainer.RegisterType;
环球集装箱。建造;
registeredTypes:=GlobalContainer.Kernel.Registry.FindAll;
对于registeredTypes中的registeredType,请执行以下操作
开始
如果不是GlobalContainer.Kernel.Registry.HassService(registeredType.ComponentTypeInfo),那么
引发异常。创建('Build Error');
结束;

但这远远不够理想。

经过夜间搜索和测试,我能够实现我的目标。 如果您只是这样注册类型:

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;
GlobalContainer.RegisterType<TApp>;
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>;
GlobalContainer.RegisterType;
容器将使用其能够使用的第一个构造函数解析此类型。要强制容器根据需要使用此构造函数,必须将此构造函数标记为[Injected],如下所示:

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;
GlobalContainer.RegisterType<TApp>;
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>;
TApp=class
私有的
_形态:TMyForm;
_答:塔普科斯;
公众的
构造函数创建;超载;
构造函数创建(表单:TMyForm);超载;
[注入]
构造函数创建(a:TAppCos);超载;
结束;
...
GlobalContainer.RegisterType;
现在,容器将尝试解析构造函数Create(a:tapcos),如果失败,他将显示一条消息,如:“cannotresolve:TApp”。(不要像以前那样使用另一条)。这就是我想要实现的

编辑: 不要忘记在TApp装置中添加Spring.Container.Common