DefaultComponentViewBuilder
using Castle.Core;
using Castle.Core.Internal;
using Castle.MicroKernel;
using Castle.MicroKernel.Handlers;
using Castle.Windsor.Diagnostics.DebuggerViews;
using System;
using System.Collections.Generic;
using System.Text;
namespace Castle.Windsor.Diagnostics.Helpers
{
public class DefaultComponentViewBuilder : IComponentDebuggerExtension
{
private readonly IHandler handler;
public DefaultComponentViewBuilder(IHandler handler)
{
this.handler = handler;
}
public IEnumerable<object> Attach()
{
yield return (object)new DebuggerViewItem("Implementation", GetImplementation());
foreach (Type service in handler.ComponentModel.Services) {
yield return (object)new DebuggerViewItem("Service", service);
}
yield return GetStatus();
yield return (object)new DebuggerViewItem("Lifestyle", handler.ComponentModel.GetLifestyleDescriptionLong());
if (HasInterceptors()) {
InterceptorReference[] array = handler.ComponentModel.Interceptors.ToArray();
yield return (object)new DebuggerViewItem("Interceptors", "Count = " + array.Length, array);
}
yield return (object)new DebuggerViewItem("Name", handler.ComponentModel.Name);
yield return (object)new DebuggerViewItem("Raw handler/component", handler);
}
private object GetImplementation()
{
Type implementation = handler.ComponentModel.Implementation;
if ((object)implementation != typeof(LateBoundComponent))
return implementation;
return LateBoundComponent.Instance;
}
private object GetStatus()
{
if (handler.CurrentState == HandlerState.Valid)
return new DebuggerViewItem("Status", "All required dependencies can be resolved.");
return new DebuggerViewItemWithDetails("Status", "This component may not resolve properly.", GetStatusDetails(handler as IExposeDependencyInfo), Array.Empty<object>());
}
private string GetStatusDetails(IExposeDependencyInfo info)
{
StringBuilder stringBuilder = new StringBuilder("Some dependencies of this component could not be statically resolved.");
if (info == null)
return stringBuilder.ToString();
DependencyInspector dependencyInspector = new DependencyInspector(stringBuilder);
info.ObtainDependencyDetails(dependencyInspector);
return dependencyInspector.Message;
}
private bool HasInterceptors()
{
return handler.ComponentModel.HasInterceptors;
}
}
}