0

我对新的 windsor3 性能计数器如何显示通过 TyepedFactory 生成的对象的跟踪感到困惑。

考虑以下情况

public interface IBFactory
{
    IB[] GetAll();
    void FreeUp(IB cmps);
}

public class B1 : IB, IDisposable
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}

public class B2 : IB, IDisposable
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}

public class B3 : IB
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}


 var container = new WindsorContainer();

 var diagnostic = LifecycledComponentsReleasePolicy.GetTrackedComponentsDiagnostic(container.Kernel);
 var counter = LifecycledComponentsReleasePolicy.GetTrackedComponentsPerformanceCounter(new PerformanceMetricsFactory());
 container.Kernel.ReleasePolicy = new LifecycledComponentsReleasePolicy(diagnostic, counter);

 Console.WriteLine("Enter number of iterations:");
 int iterations = int.Parse(Console.ReadLine());

 container.AddFacility<TypedFactoryFacility>();
 container.Register
 (
    Component.For<IBFactory>()
        .AsFactory()
        .LifeStyle.Transient,

    Classes.FromAssemblyContaining<IB>()
        .BasedOn(typeof(IB))
        .WithService.Base()
        .Configure(c => c.LifestyleTransient())
 );

 Console.WriteLine("Create Memory Leak Y or N?");
 var leak = Console.ReadLine().ToUpper() == "Y";


 var sleepFor = 100;// int.Parse(Console.ReadLine());

 for (var i = 1; i < iterations+1; i++)
 {
    var factory = container.Resolve<IBFactory>();
    Console.WriteLine("Factory created.");

    var cmp = factory.GetAll();
    foreach (var b in cmp)
    {
        b.Add(i);
    }

    Console.WriteLine("Iteration {0} completed", i);

    Thread.Sleep(sleepFor);

    if (!leak)
    {
        foreach (var b in cmp)
        {
            factory.FreeUp(b);
        }
    }

    Console.WriteLine("Releasing factory.");
    container.Release(factory);     
 }

 Console.WriteLine("container disposing.....");
 container.Dispose();
 Console.WriteLine("container disposed");
 Console.ReadLine();

如果我按照我应该的方式通过 FreeUp 工厂方法处理对象,则性能计数器会显示预期的跟踪。

相反,如果我不明确处置对象,但如果我会隐式处置工厂,作为临时创建用于测试目的,则在我处置工厂时处置 IB 实例(根据文档),但性能计数器不会得到更新和显示 IB 实例仍被跟踪...

那是什么意思?即使由于工厂处理而在 IB 实例上调用了 Dispose,性能计数器也没有更新或对象仍然被跟踪(这将是非常可怕的)。

4

0 回答 0