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)
{
return new DebuggerViewItemWithDetails(GetName(handlers, handlers.First()), GetKey(handlers.Last()), GetMismatchMessage(handlers), handlers.ConvertAll((IHandler h) => ComponentDebuggerView.BuildFor(h, null)));
}
}
}