1

我有以下项目:

MyForm 单元(只是空表):

unit uMyForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;

type
  TMyForm = class(TForm)
  end;

implementation

{$R *.fmx}

end.

应用单元:

unit App;

interface

uses
    uMyForm,
    Spring.Container;

type
    TApp = class
    private
        _myForm: TMyForm;
    public
        [Inject]
        constructor Create(myForm: TMyForm);
    end;

implementation

uses
  System.SysUtils;

{ TApp }

constructor TApp.Create(myForm: TMyForm);
begin
    _myForm := myForm;
end;

end.

并构建代码:

procedure BuildProject;
begin
    GlobalContainer.RegisterType<TApp>;
    GlobalContainer.RegisterType<TMyForm>;
    GlobalContainer.Build;

    _app := GlobalContainer.Resolve<TApp>;
end;

运行 BuildProject() 导致错误:“无法解析类型:TMyForm”。我在 VCL 平台上测试了相同的配置,一切正常。你知道这里有什么问题吗?

Edit1:我不得不更改问题描述,因为我错误地认为问题发生在两个(VCL 和 FMX)平台上。@RudyVelthuis 的评论告诉我,问题只出在 FMX 平台上。

4

2 回答 2

1

在注册期间有两种不同的类型:

  • 组件类型 - 表示正在构造的基础类型(通常是类)
  • 服务类型 - 可以解析的类型 - 这也可以是组件类型

使用RegisterType<T>时只需指定组件类型。

如果您没有为组件类型明确指定服务类型,容器将做出最佳猜测。

在此期间,Build它检查任何接口的组件类型并将它们注册为服务类型(唯一的例外是IComponentReference由 实现的TComponent)。如果没有找到,它会将类类型本身注册为服务类型。

这通常适用于 VCL(因为排除了IComponentReference),但不适用于 FMX,因为所有类都实现了许多不同的接口。

使用RegisterType带有两个泛型参数的重载(第一个是服务类型,第二个是组件类型)或添加一个或多个Implements调用将为组件类型显式注册一个或多个服务类型。

于 2017-09-25T12:21:08.287 回答
-1

我有点困惑,但是当我改变时:

GlobalContainer.RegisterType<TMyForm>;

GlobalContainer.RegisterType<TMyForm, TMyForm>;

有效。

于 2017-09-19T16:35:17.770 回答