首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring4D -如何从带有TComponent参数的容器解析到汽车厂

Spring4D -如何从带有TComponent参数的容器解析到汽车厂
EN

Stack Overflow用户
提问于 2022-05-06 12:07:33
回答 1查看 187关注 0票数 1

例如,我想解析一个传入TComponent和TNotifyEvent的类,如下面所示,但是调用TObject的基本构造函数而不是TMy。

代码语言:javascript
复制
GlobalContainer.RegisterType<TMy>;
GlobalContainer.RegisterFactory<Func<TComponent,TNotifyEvent,TMy>>(TParamResolution.ByType);
var F:=GlobalContainer.Resolve<Func<TComponent,TNotifyEvent,TMy>>;
F(Self,Self.OnActivate);

我可以通过编写一些非常丑陋的代码来解决这个问题,如下所示,但是我认为这种解决方案非常普遍,我肯定做错了什么。

代码语言:javascript
复制
    TOther = class
    end;
    
    TMy = class
    public
      constructor Create(C: TComponent; N: TNotifyEvent; O: TOther);
    end;
    
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      GlobalContainer.RegisterType<TOther>;
      GlobalContainer.RegisterType<TMy>;
    
      GlobalContainer.RegisterType<Func<TComponent,TNotifyEvent,TMy>>(
        function: Func<TComponent,TNotifyEvent,TMy>
        begin
          Result:=Func<TComponent,TNotifyEvent,TMy>(
            function(O: TComponent; N: TNotifyEVent): TMy
            begin
              Result:=TMy.Create(O,N,GlobalContainer.Resolve<TOther>);
            end
          );
        end
      );
      GlobalContainer.Build;
      var F:=GlobalContainer.Resolve<Func<TComponent,TNotifyEvent,TMy>>;
      F(Self,Self.OnActivate);
    end;

constructor TMy.Create(C: TComponent; N: TNotifyEvent; O: TOther);
begin
  OutputDebugString('Resolved');
end;

提前谢谢你的指点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 13:54:57

在最新的开发提交之后,现在应该可以工作了。

问题是类型化的参数解析被绑定到参数类型而不是参数类型。在本例中,这导致类型为TForm2 (取自传递的参数)的类型化值与TComponent类型的构造函数的C参数类型不匹配,因为匹配检查类型标识和分配兼容性。

在fix类型的参数解析精确地工作在工厂函数的参数类型上之后,而不是可能(在对象的情况下)更窄的实际参数类型之后。

FWIW供将来参考-当手动注册工厂时,通常不需要使用提供委托的RegisterType,而是可以像这样直接使用RegisterInstance (请记住,当工厂没有任何捕获状态时):

代码语言:javascript
复制
GlobalContainer.RegisterInstance<Func<TComponent,TNotifyEvent,TMy>>(
  function(const O: TComponent; const N: TNotifyEVent): TMy
  begin
    // ....
  end);

编辑:我还添加了自动检测的最佳参数分辨率默认。当工厂类型是Spring.Func<...>时,它会自动使用ByType,因此可以从RegisterFactory调用中省略。对于所有其他类型,它像以前一样使用ByName作为默认类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72141227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档