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

PotentialLifestyleMismatches

using Castle.Core; using Castle.Core.Internal; using Castle.MicroKernel; using Castle.Windsor.Diagnostics.DebuggerViews; using Castle.Windsor.Diagnostics.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Castle.Windsor.Diagnostics.Extensions { public class PotentialLifestyleMismatches : AbstractContainerDebuggerExtension { private const string name = "Potential lifestyle mismatches"; private IPotentialLifestyleMismatchesDiagnostic diagnostic; public static string Name => "Potential lifestyle mismatches"; public override IEnumerable<DebuggerViewItem> Attach() { IHandler[][] array = diagnostic.Inspect(); if (array.Length == 0) return Enumerable.Empty<DebuggerViewItem>(); Array.Sort(array, (IHandler[] f, IHandler[] s) => f[0].ComponentModel.Name.CompareTo(s[0].ComponentModel.Name)); object[] value = array.ConvertAll(MismatchedComponentView); return new DebuggerViewItem[1] { new DebuggerViewItem("Potential lifestyle mismatches", "Count = " + array.Length, value) }; } public override void Init(IKernel kernel, IDiagnosticsHost diagnosticsHost) { diagnostic = new PotentialLifestyleMismatchesDiagnostic(kernel); diagnosticsHost.AddDiagnostic(diagnostic); } private string GetKey(IHandler root) { return $"""{GetNameDescription(root.ComponentModel)}""{root.ComponentModel.GetLifestyleDescription()}"""; } private string GetMismatchMessage(IHandler[] handlers) { StringBuilder stringBuilder = new StringBuilder(); IHandler handler = handlers.First(); IHandler handler2 = handlers.Last(); stringBuilder.AppendFormat("Component '{0}' with lifestyle {1} ", GetNameDescription(handler.ComponentModel), handler.ComponentModel.GetLifestyleDescription()); stringBuilder.AppendFormat("depends on '{0}' with lifestyle {1}", GetNameDescription(handler2.ComponentModel), handler2.ComponentModel.GetLifestyleDescription()); for (int i = 1; i < handlers.Length - 1; i++) { IHandler handler3 = handlers[i]; stringBuilder.AppendLine(); stringBuilder.AppendFormat("\tvia '{0}' with lifestyle {1}", GetNameDescription(handler3.ComponentModel), handler3.ComponentModel.GetLifestyleDescription()); } stringBuilder.AppendLine(); stringBuilder.AppendFormat("This kind of dependency is usually not desired and may lead to various kinds of bugs."); return stringBuilder.ToString(); } private string GetName(IHandler[] handlers, IHandler root) { string arg = (handlers.Length > 2) ? "indirectly " : string.Empty; return $"""{GetNameDescription(root.ComponentModel)}""{root.ComponentModel.GetLifestyleDescription()}""{arg}"""; } private string GetNameDescription(ComponentModel componentModel) { if (componentModel.ComponentName.SetByUser) return componentModel.ComponentName.Name; return componentModel.ToString(); } private object MismatchedComponentView(IHandler[] handlers) { string text = GetName(handlers, handlers.First()); string key = GetKey(handlers.Last()); string mismatchMessage = GetMismatchMessage(handlers); object[] items = handlers.ConvertAll((IHandler h) => ComponentDebuggerView.BuildFor(h, null)); return new DebuggerViewItemWithDetails(text, key, mismatchMessage, items); } } }