首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring4d自定义BuilderInspector未调用

Spring4d自定义BuilderInspector未调用
EN

Stack Overflow用户
提问于 2022-07-28 11:54:42
回答 1查看 59关注 0票数 0

我在Spring4d容器中注册了许多对象,有些是因为Singleton.When应用程序关闭--几乎是单个对象正确调用自己的破坏--但也有一些对象和FastMM报告内存泄漏。我在寻找一种方法,如何记录哪些对象有问题。我尝试使用这个简单的例子来体验容器扩展:

代码语言:javascript
复制
unit Spring.Container.HCV.Extension;

interface

uses
  Spring.Container.Extensions, Spring.Container.Core, Spring.Container.Builder;

type
  THCVLoggerBuilderInspector = class(TInspectorBase)
  protected
    procedure DoProcessModel(const kernel: IKernel; const model: TComponentModel); override;
  end;

  TFakeBuilderInspector = class(TInspectorBase)
  protected
    procedure DoProcessModel(const kernel: IKernel; const model: TComponentModel);
        override;
  end;

  THCVLoggerExtension = class(TContainerExtension)
  protected
    procedure Initialize; override;
  end;

implementation
uses
  Spring.Container.Common;

procedure THCVLoggerBuilderInspector.DoProcessModel(const kernel: IKernel;
    const model: TComponentModel);
var
  lLT:string;
begin
  if model.ComponentType.IsInstance then
  begin
    case model.LifetimeType of
      TLifetimeType.Unknown:            lLT:='Unknown           ';
      TLifetimeType.Singleton:          lLT:='Singleton         ';
      TLifetimeType.Transient:          lLT:='Transient         ';
      TLifetimeType.PerResolve:         lLT:='PerResolve        ';
      TLifetimeType.SingletonPerThread: lLT:='SingletonPerThread';
      TLifetimeType.Pooled:             lLT:='Pooled            ';
      TLifetimeType.Custom:             lLT:='Custom            ';
    else
    end;
    kernel.Logger.Info('Builder: [%s] %s',[lLT,model.ComponentTypeName]);
  end;
end;

procedure THCVLoggerExtension.Initialize;
begin
  Kernel.Builder.AddInspector(THCVLoggerBuilderInspector.Create);
  Kernel.Builder.AddInspector(TFakeBuilderInspector.Create);
end;

procedure TFakeBuilderInspector.DoProcessModel(const kernel: IKernel; const
    model: TComponentModel);
begin
  kernel.Logger.Info('FakeBuilderInspector');
end;

end.

在注册方面我有

代码语言:javascript
复制
container.AddExtension<THCVLoggerExtension>;

容器正确调用THCVLoggerExtension.Initialize,但在我的检查人员中从未被称为DoProcessModel.Why?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-28 16:03:20

可能是因为在容器上调用Build之后添加了扩展吗?另一个原因可能是没有看到任何日志记录--您是否在DoProcessModel中放置了一个断点来验证它没有被调用?

对于实际的问题:使用单例的内存泄漏几乎总是由于容器没有计算出正确的重新计算这些类的结果。在注册任何未从TRefCounting继承的类时,将正确的AsSingleton值传递给TInterfacedObject

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

https://stackoverflow.com/questions/73152477

复制
相关文章

相似问题

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