ReleasePolicyTrackedObjects
using Castle.MicroKernel;
using Castle.Windsor.Diagnostics.DebuggerViews;
using Castle.Windsor.Diagnostics.Helpers;
using System.Collections.Generic;
using System.Linq;
namespace Castle.Windsor.Diagnostics.Extensions
{
public class ReleasePolicyTrackedObjects : AbstractContainerDebuggerExtension
{
private const string name = "Objects tracked by release policy";
private TrackedComponentsDiagnostic diagnostic;
public static string Name => "Objects tracked by release policy";
public override IEnumerable<DebuggerViewItem> Attach()
{
ILookup<IHandler, object> lookup = diagnostic.Inspect();
if (lookup == null)
return new DebuggerViewItem[0];
DebuggerViewItem debuggerViewItem = BuildItem(lookup);
if (debuggerViewItem != null)
return new DebuggerViewItem[1] {
debuggerViewItem
};
return new DebuggerViewItem[0];
}
public override void Init(IKernel kernel, IDiagnosticsHost diagnosticsHost)
{
diagnostic = new TrackedComponentsDiagnostic();
diagnosticsHost.AddDiagnostic((ITrackedComponentsDiagnostic)diagnostic);
}
private DebuggerViewItem BuildItem(ILookup<IHandler, object> results)
{
int num = 0;
List<DebuggerViewItem> list = new List<DebuggerViewItem>();
foreach (IGrouping<IHandler, object> item2 in from l in results
orderby l.Key.ComponentModel.Name
select l) {
IHandler key = item2.Key;
object[] array = item2.ToArray();
num += array.Length;
ComponentDebuggerView componentDebuggerView = ComponentDebuggerView.BuildFor(key, null);
DebuggerViewItem item = new DebuggerViewItem(key.GetComponentName(), "Count = " + array.Length.ToString(), new MasterDetailsDebuggerViewItem(componentDebuggerView, componentDebuggerView.Description, "Component", array));
list.Add(item);
}
list.Sort((DebuggerViewItem f, DebuggerViewItem s) => f.Name.CompareTo(s.Name));
return new DebuggerViewItem("Objects tracked by release policy", "Count = " + num.ToString(), list.ToArray());
}
}
}