You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring4D中BeforeResolve/AfterResolve拦截实现父级关联构造的问询

依赖注入中实现对象构造的层级关联需求

类结构伪代码

TOuter.constructor.Create(Name: TName; Inner1, Inner2: TInner);
TInner.constructor.Create(Name: TName; Sub: TSub);
TSub.constructor.Create(Name: TName);
TName.constructor.Create(Name: String);
var Names = TStack<String>.Create;

需求说明

需要通过拦截依赖注入容器的BeforeResolve和AfterResolve事件,实现对象构造时的父级/祖先关联,让对象知晓自己是为哪个上级构造的,最终生成层级化的Name属性。

当前尝试的实现代码

RegisterType<TName>(
  function: TName
    begin
      Result:=TName.Create(String.Join('.',Names.List.ToArray));
    end;
);

RegisterType<TOuter>;
RegisterType<TInner>;
RegisterType<TSub>;

Resolver.BeforeResolve:=
    procedure(ClassType: TClass)
    begin
      Names.Push(ClassType.ClassName);
    end;

Resolver.AfterResolve:=
    procedure(ClassType: TClass)
    begin
      Names.Pop;
    end;

期望结果

调用Resolve<TOuter>后,对象的层级化Name属性应如下:

TOuter
    Name = 'Outer'
    Inner1 = 
        Name = 'Outer.Inner'
        Sub
            Name = 'Outer.Inner.Sub'
    Inner2
      Name = 'Outer.Inner'
        Sub 
          Name = 'Outer.Inner.Sub'

疑问

我考虑过通过子类化组件激活器,判断目标类是否为TName或构造参数是否包含TName来实现,但不确定这种方案是否可行。

注:示例中省略了Names栈的多线程处理逻辑,实际场景中我使用的是存储父级信息的接口栈而非字符串栈。

内容的提问来源于stack exchange,提问作者Richard Shuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:11