DuplicatedDependenciesDebuggerExtension
using Castle.Core;
using Castle.Core.Internal;
using Castle.MicroKernel;
using Castle.Windsor.Diagnostics.DebuggerViews;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Castle.Windsor.Diagnostics.Extensions
{
public class DuplicatedDependenciesDebuggerExtension : AbstractContainerDebuggerExtension
{
private const string name = "Components with potentially duplicated dependencies";
private DuplicatedDependenciesDiagnostic diagnostic;
public static string Name => "Components with potentially duplicated dependencies";
public override IEnumerable<DebuggerViewItem> Attach()
{
Pair<IHandler, DependencyDuplicate[]>[] array = diagnostic.Inspect();
if (array.Length == 0)
return Enumerable.Empty<DebuggerViewItem>();
ComponentDebuggerView[] array2 = BuildItems(array);
return new DebuggerViewItem[1] {
new DebuggerViewItem("Components with potentially duplicated dependencies", "Count = " + array2.Length, array2)
};
}
public override void Init(IKernel kernel, IDiagnosticsHost diagnosticsHost)
{
diagnostic = new DuplicatedDependenciesDiagnostic(kernel);
diagnosticsHost.AddDiagnostic((IDuplicatedDependenciesDiagnostic)diagnostic);
}
private ComponentDebuggerView[] BuildItems(Pair<IHandler, DependencyDuplicate[]>[] results)
{
return results.ConvertAll(ComponentWithDuplicateDependenciesView);
}
private ComponentDebuggerView ComponentWithDuplicateDependenciesView(Pair<IHandler, DependencyDuplicate[]> input)
{
IHandler first = input.get_First();
DependencyDuplicate[] second = input.get_Second();
DebuggerViewItemWithDetails[] array = second.ConvertAll(MismatchView);
Array.Sort(array, (DebuggerViewItemWithDetails c1, DebuggerViewItemWithDetails c2) => c1.Name.CompareTo(c2.Name));
string description = "Count = " + second.Length;
object[] items = array;
return ComponentDebuggerView.BuildRawFor(first, description, items);
}
private DebuggerViewItemWithDetails MismatchView(DependencyDuplicate input)
{
return new DebuggerViewItemWithDetails(Description(input.Dependency1), Description(input.Dependency2), diagnostic.GetDetails(input), Array.Empty<object>());
}
private static string Description(DependencyModel dependencyModel)
{
return dependencyModel.TargetItemType.ToCSharpString() + " " + dependencyModel.DependencyKey;
}
}
}