<PackageReference Include="Castle.Windsor" Version="5.1.0-beta001" />

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; } } }