Spring4d自定义BuilderInspector的DoProcessModel未触发问题排查
注册时机太晚
Spring4d的BuilderInspector仅对扩展添加之后注册的类型模型生效。如果你的THCVLoggerExtension是在部分类型已经注册到容器后才添加的,那早注册的类型不会触发DoProcessModel。解决办法是:确保在任何类型注册到容器之前就添加该扩展,比如在容器初始化的最开始就调用Container.AddExtension(THCVLoggerExtension.Create)。Inspector未正确添加到Builder的Inspectors集合
检查扩展Initialize方法的代码,确认是否正确将自定义Inspector添加到容器Builder的Inspectors集合中。正确的代码示例如下:procedure THCVLoggerExtension.Initialize(const container: ICurrencyContainer); var builder: IBuilder; begin if container.SupportsService(IBuilder, builder) then builder.Inspectors.Add(TMyCustomInspector.Create); end;若添加到了错误集合,或是获取IBuilder实例失败,都会导致Inspector无法生效。
自定义Inspector的CanProcessModel返回False
如果你重写了TBuilderInspector的CanProcessModel方法,检查是否返回True。默认的CanProcessModel返回值为True,但如果重写逻辑有误(比如错误过滤了所有模型),会直接导致DoProcessModel不被调用。例如:function TMyCustomInspector.CanProcessModel(const model: TComponentModel): Boolean; begin // 若要处理所有模型,直接返回True即可 Result := True; end;容器Builder被后续操作替换
如果添加扩展后,你重新创建了IBuilder实例并赋值给容器,或是调用了类似Container.Build的方法替换了Builder,之前添加的Inspector会丢失。需确保添加扩展后,不要重置或替换容器的Builder。
额外补充:如果你的单例是通过RegisterInstance直接注册的实例(而非通过类型注册),这类模型可能不会触发BuilderInspector的处理逻辑。这种情况下,你需要在扩展中单独监听容器的实例注册事件来处理。
内容的提问来源于stack exchange,提问作者egroups

