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
相关产品推荐
相关产品推荐

