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, 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, list.ToArray());
        }
    }
}