代码之家  ›  专栏  ›  技术社区  ›  aQuu

DI容器无法解析FMX控件

  •  1
  • aQuu  · 技术社区  · 7 年前

    我有以下项目:

    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平台上测试了相同的配置,一切正常。你知道这里出了什么问题吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Stefan Glienke    7 年前

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

    • 组件类型-表示正在构造的底层类型(通常是类)

    使用时 RegisterType<T> 只能指定零部件类型。

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

    Build 它检查任何接口的组件类型,并将其注册为服务类型(唯一的例外是 IComponentReference TComponent ). 如果没有找到任何类型,则将类类型本身注册为服务类型。

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

    使用 RegisterType Implements 调用将为组件类型显式注册一个或多个服务类型。

        2
  •  -1
  •   aQuu    7 年前

    GlobalContainer.RegisterType<TMyForm>;
    

    GlobalContainer.RegisterType<TMyForm, TMyForm>;
    

    它成功了。